質問

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('<'))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top