2011-07-19 42 views
1

我目前正在爲XBMC女巫開發一個web界面,其中包含ajax。 由於out ajax的限制,我不得不使用本地資源,而不是我的ajax類,它通常會生成輸出。 我有一個字符串。 *表示,這個文本可以改變。與javascript匹配

這是字符串:

文件名:SMB:// SERVER /音樂/關門合唱團/ 2000更好 生活/ 07更好Life.mp3 PlayStatus:打SongNo:6類型:音頻 標題:Better Life曲目:7藝術家:3 Doors Down專輯:The Better Life 類別:另類年份:2000網址:smb:// xbox:xbox @ SERVER/Music/3門 Down/2000更美好的生活/ 07更好Life.mp3歌詞:比特率:193 採樣率:44 Thumb:DefaultAlbumCover.png時間:02:05持續時間:03:07 百分比:66文件大小:4509417更改:錯誤

我想知道我可以如何匹配標題,Arist,時間和持續時間。 我試過用正則表達式,但沒有成功,因爲我沒有太多的JS知識。

感謝, Brantje

編輯: 「你確定這就是字符串中的所有不帶換行一起運行這樣的編輯:??我編輯的問題,以修正格式 - 阿里爾3小時前」

不, 從http://xbox/xbmcCmds/xbmcHttp?command=GetCurrentlyPlaying 輸出的播放視頻

HTML代碼時,貌似這個

在播放音樂時,它的高音不同。

<html> 
<li>Filename:smb://SERVER/Music/3 Doors Down/2000 The Better Life/01 Kryptonite.mp3 
<li>PlayStatus:Playing 
<li>SongNo:-1 
<li>Type:Audio 
<li>Title:Kryptonite 
<li>Track:1 
<li>Artist:3 Doors Down 
<li>Album:The Better Life 
<li>Genre:Alternative 
<li>Year:2000 
<li>URL:smb://xbox:[email protected]/Music/3 Doors Down/2000 The Better Life/01 Kryptonite.mp3 
<li>Lyrics: 
<li>Bitrate:192 
<li>Samplerate:44 
<li>Thumb:DefaultAlbumCover.png 
<li>Time:00:05 
<li>Duration:03:54 
<li>Percentage:2 
<li>File size:5618471 
<li>Changed:False</html> 
+2

你有可能使用[JSON](http://en.wikipedia.org/wiki/Json)嗎?請? –

+4

「由於ajax的限制,我不得不使用本地資源,而不是我的ajax類,通常會生成輸出。」 - 你能解釋一下嗎? – slandau

+2

@slandau通常表示「由於開發人員的限制」;) – AlienWebguy

回答

1

假設以下字符串:

var str = "Filename:smb://SERVER/Music/3 Doors Down/2000 The Better Life/07 Better Life.mp3 PlayStatus:Playing SongNo:6 Type:Audio Title:Better Life Track:7 Artist:3 Doors Down Album:The Better Life Genre:Alternative Year:2000 URL:smb://xbox:[email protected]/Music/3 Doors Down/2000 The Better Life/07 Better Life.mp3 Lyrics: Bitrate:193 Samplerate:44 Thumb:DefaultAlbumCover.png Time:02:05 Duration:03:07 Percentage:66 File size:4509417 Changed:False"; 

提取屬性轉換成字典/圖:

var dict = (" " + str).split(/ (\w+):/).reduce(function(acc, el, i, orig) { 
    if (i % 2) 
     acc[el] = orig[i + 1]; 
    return acc; 
}, {}); 

這裏有沒有一個高階函數相同的事情:

var i, dict = {}, pair = (" " + str).split(/ (\w+):/); 
for (i = 1; i < pair.length; i += 2) 
    dict[pair[i]] = pair[i + 1]; 

Ret rieving值現在是微不足道的:

console.log(dict["Title"]); 
console.log(dict["Artist"]); 
console.log(dict["Time"]); 
console.log(dict["Duration"]); 

輸出:

Better Life 
3 Doors Down 
02:05 
03:07 
0

以下是我用正則表達式做的:

var data = "Filename:smb://SERVER/Music/3 Doors Down/2000 The Better Life/07 Better Life.mp3 PlayStatus:Playing SongNo:6 Type:Audio Title:Better Life Track:7 Artist:3 Doors Down Album:The Better Life Genre:Alternative Year:2000 URL:smb://xbox:[email protected]/Music/3 Doors Down/2000 The Better Life/07 Better Life.mp3 Lyrics: Bitrate:193 Samplerate:44 Thumb:DefaultAlbumCover.png Time:02:05 Duration:03:07 Percentage:66 File size:4509417 Changed:False"; 

function matchField(field, str) { 
    // regexp: space, field, colon, (fewest number of chars), space, fewest number of non-whitespace chars, colon 
    var re = new RegExp("\\s" + field + ":(.+?)\\s\\S+?:"); 
    try { 
     return(str.match(re)[1]); 
    } catch(e) {} 
    return(""); 
} 

var songTitle = matchField("Title", data); 
var artist = matchField("Artist", data); 
var duration = matchField("Duration", data); 

而且你可以看到它在這裏的行動:http://jsfiddle.net/jfriend00/Y9g7x/

結果:

Title: Better Life 
Artist: 3 Doors Down 
Duration: 03:07 

我認爲它實際上可能與一個正則表達式來做到這一切,但是這將迫使不同字段的順序每次都完全一樣。