このデータに一致する正規表現は何ですか?
-
06-07-2019 - |
質問
XHTMLドキュメント内に次のものがあります:
<script type="text/javascript" id="JSBALLOONS">
function() {
this.init = function() {
this.wAPI = new widgetAPI('__BALLOONS__');
this.getRssFeed();
};
}
</script>
2つのスクリプトタグの間のすべてを選択しようとしています。 id
は、役立つ場合は常にJSBALLOONSになります。スクリプトタグを含めて選択する方法は知っていますが、スクリプトタグを除くコンテンツを選択する方法はわかりません。正規表現の結果は次のようになります。
function() {
this.init = function() {
this.wAPI = new widgetAPI('__BALLOONS__');
this.getRssFeed();
};
}
解決
(Javascriptソリューション専用の更新された投稿。)
Javascriptでは、コードは次のようになります。
if (data.match(/<script[^>]+id="JSBALLOONS">([\S\s]*?)<\/script>/)) {
inner_script = RegExp.$1;
}
括弧内のその部分([\ S \ s] *?)
は正規表現エンジンによって保存され、一致が見つかった後にアクセスできます。 JavaScriptでは、 RegExp。$ 1
を使用して、スクリプトタグ内の一致した部分を参照できます。 ()
で囲まれたこのようなグループが複数ある場合は、 RegExp。$ 2
などを使用して、 RegExpまで参照できます。 。$ 9
。
Javascriptはデフォルトでは改行文字と一致しません。そのため、(。*?)
([\ S \ s] *?)を使用する必要があります。 >、より理にかなっている可能性があります。完了するために、他の言語では s
修飾子( /.../ s
)を使用する場合、これは必要ありません。
(このようなHTMLページからコンテンツをスクレイピングする場合、通常、正規表現は非常に壊れやすいことを追加する必要があります。 jQuery フレームワークでコンテンツを抽出します。)
他のヒント
紳士が1ドルで意味するのは、「最初のキャプチャグループの値」です。正規表現の一部を括弧で囲むと、キャプチャグループが定義されます。左から右に数えます。各開き括弧は、新しいキャプチャグループを開始します。ネストできます。
(キャプチャグループを定義せずにサブ式を定義する方法があります-構文を忘れています。)
Perlでは、$ 1は最初のキャプチャグループと一致する文字列を保持するマジック変数、$ 2は2番目と一致する文字列などです。他の言語では、返された一致オブジェクトのメソッドを呼び出してN番目キャプチャグループ。
しかし、molfのソリューションに戻ります。代わりにこのパターンを使用するように彼が言ったとします:
/<script[^>]+id="JSBALLOONS">(.*)<\/script>/
この場合、複数のスクリプト要素がある場合、この不正なパターンは貪欲であるため、それらをすべて飲み込んでしまいます。このパターンは、最初の開始タグで始まり、その終了タグに一致し、続行し、最後に最後に一致します。 molfのソリューションの魔法は、(。*?)の疑問符であり、これは欲張りではありません。パターンに一致する最短の文字列を返すため、余分なスクリプト要素を飲み込むことはありません。
非正規言語には正規表現を使用しないでください。正しい方法は、XMLパーサーを使用することです。 DOM:
document.getElementById("JSBALLOONS")
編集:あなたのコメントに関して、私はJavaScriptやjQueryの経験がありませんが、いくつかの検索の後、これらの行に沿って何かが動作するはずだと思います:
$.ajax({
type: "GET",
url: "test.xml",
dataType: "xml",
success: function(xml) {
return $(xml).find("#JSBALLOONS").text();
}
});
他の誰かがこれを修正できますか?
foo
をコードを含む文字列にします。その後、次の方法で囲んでいるタグを削除できます
foo = foo.substring(foo.indexOf('>') + 1, foo.lastIndexOf('<'))