0

TruClient プロトコル (Firefox) を使用して Vugen でスクリプトを作成しているEvaluate JS on objectときに、次のようなオブジェクトを見つける手順がありますobject.innerHTML

Foo Bar<br />BAZ
<br />

このテキストから抽出BAZして他の場所で使用する必要があるため、正規表現を使用して抽出するために、JS 部分に次のコードがあります。

var regex = /Foo\s+Bar<br\s+\/>(.*)\s*<br \/>/i;  // Shows as red in the TC JS editor, but no error icon shows, so not sure what the error may be.
var matches = [];
var match;
matches = regex.exec(object.innerHTML);
match = matches[matches.length - 1];
window.alert(match);  // For debugging purposes

ただし、スクリプトを実行すると、次のエラーで失敗します。

** 6: Evaluate JavaScript var regex = /Foo\s+B... alert(match); on Foo Bar
** failed - an argument is invalid: 'Code': JavaScript exception
'TypeError: matches is null' during evaluation

この正規表現をここでテストしましたが、期待どおりに動作します。

webtoolkit online JS testerを使用して、コードで次のバリアントを正常にテストし、必要なものが抽出されることを確認しました。

var data = "Foo Bar<br />BAZ<br />";
var regex = /Foo\s+Bar<br\s+\/>(.*)\s*<br \/>/i;
var matches = [];
var match;
matches = regex.exec(data);
match = matches[matches.length - 1];
alert(match);

これは期待どおりに返さBAZれます。

編集

当初、これは Vugen/TruClient 固有の問題であると想定していました。しかし、それについて寝て、Michael Galos の回答 (以下) を読んだ後、これは一般的な Javascript の問題であることに気付き、これにも Javascript タグを追加しました。

4

2 に答える 2

1

回答の一部を提供してくれた Michael Galos に感謝します。しかし、彼の答えは問題を完全には解決しませんでした。

デバッグ コードを挿入object.innerHTMLしてコンソールに書き込み、より詳細に調べました。最後に、n+1それを 2 回実行して出力を確認した後、ページのソースが次のようになっていることがわかりました。

Foo Bar<br />BAZ
<br />

しかし、Javascriptはこれを次のようにキャプチャしました:

Foo Bar<br>BAZ <br>

その結果、正規表現を次のように変更しました。

var re = /<br\s*\/?>\s*(.*?)\s*<br\s*\/?>/i

<br />タグの正規表現を から に変更すると、または のいずれか<br\s+\/><br\s*\/?>一致します。は0 個以上の空白文字に一致し、オプションで は文字に一致します。<br /><br>\s*\/?/

キャプチャ グループの前に追加\s*すると先頭の空白が削除 ?され、キャプチャ グループの最後に追加すると末尾の空白が非貪欲な一致に変換されて削除されます。

これは、単一行または複数行の次の任意の組み合わせに一致し、 のみを返すようになりましたBAZ:

Foo Bar<br />BAZ<br />
Foo Bar<br>BAZ<br>
Foo Bar<br />     BAZ     <br />
Foo Bar<br>     BAZ     <br>
于 2016-02-03T16:48:45.280 に答える
1

あなたが探しているのは、正規表現の「単一行」フラグです。
残念ながらJavascriptには存在しません(regex101.comはそれをシミュレートします)。

これを回避するには、これを使用して改行を回避できます。

[\s\S]

したがって、あなたの場合、次のようなものを試してください:

var regex = /Foo\s+Bar<br\s+\/>(.*)[\s\S]*<br \/>/i; 
于 2016-02-03T13:47:25.233 に答える