5

このようなhtml要素である単一行の文字列を保持する変数が1つあります。

var des = "<p> --Sometext before-- FI: This is fi name, This is fi manufacturer <br /> SE:This is se name, This is se manufacturer <br /> EN: This is en name, This is en manufacturer</p>";

FI: の後のすべてを選択したい: コンマ記号が 1 つの変数に入るまで、コンマ記号の後は
タグが別の変数に入るまで。また、SE: と EN: も同様です。

たとえば、このような結果になります。

    var fi_name         = "This is fi name";
    var fi_manufacturer = "This is fi manufacturer";
    var se_name         = "This is se name";
    var se_manufacturer = "This is se manufacturer";
    var en_name         = "This is en name";
    var en_manufacturer = "This is en manufacturer";

文字列は動的に変化しますが、パターンは同じです。

例えば:

<p> --Sometext before-- FI:[name],[manufacturer]<br/ >SE:[name],[manufacturer]<br/ >FI:[name],[manufacturer]</p>

JsFiddleでデモを見ることができます。

現在、null エラーがスローされています。

編集済み vvv

ライブ Web サイトでは機能しません。des 変数は完全に次のようになります。http://jsfiddle.net/AM8X2/を参照してください。また null をスローしています。

4

3 に答える 3

2

指定されたパターンを探して、そこから関連情報を抽出するだけです。

var des = "<p>FI: This is fi name, This is fi manufacturer <br /> SE:This is se name, This is se manufacturer <br /> EN: This is en name, This is en manufacturer</p>";

var f = function(w, s) {
    return new RegExp(w + ':([^,]+)').exec(s)[1];
}

fi = f('FI', des);
se = f('SE', des);
en = f('EN', des);

w + ':([^,]+)'次のように説明できます:winのコロンの後の値を取得しますs

これが更新されたフィドルです。


より完全なソリューション、すべてのHTMLタグを処理するソリューションは、次のようになります。

var f = function(w, s) {
    var el = document.createElement('div'), arr;
    el.innerHTML = s;

    arr = (new RegExp(w + ':([^\n]+)').exec(el.innerText)[1]).split(',');

    return {
        manufacturer: arr[1],
        name: arr[0]       
    }
}

fi = JSON.stringify(f('FI', des));
se = JSON.stringify(f('SE', des));
en = JSON.stringify(f('EN', des));

このためのフィドルはここにあります

変数内のこれらのいずれかにアクセスするには(、を使用せずにJSON.stringify()、直接メソッドを返す、つまりf('SE', des))、次のようにします。

// for fi manufacturer
fi.manufacturer

// for en name
en.name

// etc..

私の意見では、これを使用することで、はるかにモジュール化されたアプローチが得られ、エラーの可能性が低くなります。

于 2013-01-02T11:34:05.207 に答える
1

考えられる解決策は次のとおりです。

var des = "<p> --Sometext before-- FI: This is fi name, This is fi manufacturer <br /> SE:This is se name, This is se manufacturer <br /> EN: This is en name, This is en manufacturer</p>";

​var matches = des.match( /([A-Z]{2}):\s*([^,]+?)\s*,\s*([^<$]+?)\s*(?=<|$)/g );

var results = [];

for ( var i = 0; i < matches.length; i++ ) {
    var res = matches[ i ].match( /([A-Z]{2}):\s*([^,]+?)\s*,\s*([^<$]+?)\s*(?=<|$)/ );
    var abbr = res[ 1 ].toLowerCase();

    results[ abbr + '_name' ] = res[ 2 ];
    results[ abbr + '_manufacturer' ] = res[ 3 ];
}

console.log( results );

このフィドルで試してみてください:http://jsfiddle.net/bukfixart/QB5qu/

于 2013-01-02T11:33:37.577 に答える
1

jsFiddle を次のように変更しました。

http://jsfiddle.net/11684/raPDd/4/

正規表現に大文字とスペースとコンマを追加したので、null は返されず (一致が見つからなかったため)、残りは問題ありませんでした。
結果:

var fi,se,en;
var des = "<p>FI: This is fi name, This is fi manufacturer <br /> SE:This is se name, This is se manufacturer <br /> EN: This is en name, This is en manufacturer</p>";

var match = des.match(/<p>FI:([a-zA-Z ,]+)<br \/> SE:([a-zA-Z ,]+)<br \/> EN:([a-zA-Z ,]+)<\/p>/);
fi = match[1];
se = match[2];
en = match[3];

alert("[FI]: " + fi + "\n[SE]:" + se + "\n[EN]:" + en);​

編集:
別の変数で名前とメーカーが必要だとは思わなかったので、フィドルを編集しました: http://jsfiddle.net/11684/raPDd/5/これに:

var fi,se,en;
var des = "<p>FI: This is fi name, This is fi manufacturer <br /> SE:This is se name, This is se manufacturer <br /> EN: This is en name, This is en manufacturer</p>";

var match = des.match(/<p>FI:([a-zA-Z ,]+)<br \/> SE:([a-zA-Z ,]+)<br \/> EN:([a-zA-Z ,]+)<\/p>/);
fi = match[1];
se = match[2];
en = match[3];

//After that just split on the comma:

var fi_name = fi.split(",")[0];
var fi_manu = fi.split(",")[1];
var en_name = en.split(",")[0];
var en_manu = en.split(",")[1];
var se_name = se.split(",")[0];
var se_manu = se.split(",")[1];
​
于 2013-01-02T11:44:16.063 に答える