1

私は現在、ajax を含む XBMC witch の Web インターフェイスを開発しています。out ajax の制限により、通常は出力を生成する ajax クラスではなく、ローカル リソースを使用することを余儀なくされました。私はひもを持っています。* は、このテキストが変更される可能性があることを意味します。

これは文字列です:

ファイル名: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ジャンル:Alternative 年:2000 URL:smb://xbox:xbox@SERVER/Music/3 Doors Down/2000 The Better Life/07 Better Life.mp3 Lyrics: Bitrate:193 Samplerate:44 Thumb:DefaultAlbumCover.png Time:02 :05 時間:03:07 パーセンテージ:66 ファイル サイズ:4509417 変更:False

タイトル、アーティスト、時間、期間を一致させる方法を知りたいです。正規表現を試してみましたが、JS の知識があまりないため、成功しませんでした。

ありがとう、ブランチェ

編集: 「本当にそれが文字列ですか? 改行なしですべて一緒に実行されますか? 編集: フォーマットを修正するために質問を編集しました. – アリエル 2 時間前」

いいえ、 http://xbox/xbmcCmds/xbmcHttp?command=GetCurrentlyPlayingからの出力は 、ビデオを再生すると次のようになります

HTML コード:

<html> 
<li>Filename:smb://SERVER/Movies/Drive Angry/Drive Angry (2011) DVDRip XviD-MAXSPEED.avi
<li>PlayStatus:Playing
<li>VideoNo:0
<li>Type:Video
<li>Thumb:DefaultVideoCover.png
<li>Time:00:00:28
<li>Duration:01:44:31
<li>Percentage:0
<li>File size:1666804442
<li>Changed:False</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:xbox@SERVER/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> 
4

2 に答える 2

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:xbox@SERVER/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];

値の取得は簡単です:

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
于 2011-07-19T21:58:52.650 に答える
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:xbox@SERVER/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

1 つの正規表現ですべてを実行することは実際には可能だと思いますが、それでは異なるフィールドの順序が毎回まったく同じになる必要があります。

于 2011-07-19T22:16:56.487 に答える