0

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();
        };
    }
4

4 に答える 4

8

(Javascript ソリューション専用の更新された投稿。)

Javascript では、コードは次のようになります。

if (data.match(/<script[^>]+id="JSBALLOONS">([\S\s]*?)<\/script>/)) {
    inner_script = RegExp.$1;
}

括弧の間の部分([\S\s]*?)は正規表現エンジンによって保存され、一致が見つかった後にアクセスできます。RegExp.$1Javascriptでは、スクリプトタグ内の一致した部分を参照するために使用できます。で囲まれたそのようなグループが複数ある場合は、 などでそれら()を参照できます。RegExp.$2RegExp.$9

Javascript はデフォルトでは改行文字と一致しないため、より意味のある([\S\s]*?)ではなくを使用する必要があります。補足として、他の言語では修飾子 ( )(.*?)を使用する場合、これは必要ありません。s/.../s

(このような HTML ページからコンテンツをスクレイピングする場合、通常、正規表現は非常に脆弱であることを付け加えておく必要があります。jQueryフレームワークを使用してコンテンツを抽出する方がよい場合があります。)

于 2009-06-23T18:08:50.553 に答える
2

非正規言語に正規表現を使用しようとしないでください。正しい方法は、XML パーサーを使用することです。DOM:

document.getElementById("JSBALLOONS")

編集: あなたのコメントに関して、私は JavaScript や jQuery の経験がありませんが、いくつかの検索の後、これらの行に沿った何かがうまくいくはずだと思います:

$.ajax({
  type: "GET",
  url: "test.xml",
  dataType: "xml",
  success: function(xml) {
    return $(xml).find("#JSBALLOONS").text();
  }
});

より資格のある誰かがこれを修正できますか?

于 2009-06-23T18:44:56.733 に答える
2

紳士が $1 で意味するのは、「最初のキャプチャ グループの値」です。正規表現の一部を括弧で囲むと、キャプチャ グループが定義されます。左から右に数えます。各左括弧は、新しいキャプチャ グループを開始します。それらは入れ子にすることができます。

(キャプチャ グループを定義せずにサブ式を定義する方法があります。構文を忘れてしまいました。)

Perl では、$1 は最初のキャプチャ グループで一致した文字列を保持するマジック変数であり、$2 は 2 番目のキャプチャ グループで一致した文字列です。その他の言語では、N 番目のキャプチャ グループを取得するために、返された一致オブジェクトでメソッドを呼び出す必要がある場合があります。

しかし、モルフの解決策に戻ります。代わりにこのパターンを使用するように彼が言ったとします。

/<script[^>]+id="JSBALLOONS">(.*)<\/script>/

この場合、スクリプト要素が複数ある場合、この不正なパターンは貪欲であるため、それらすべてを飲み込んでしまいます。これは説明する価値があります。このパターンは、最初の開始タグで始まり、その終了タグに一致し、続行し、最後に最後の に一致します。molf のソリューションの魔法は、(.*?) 内のクエスチョン マークであり、欲張りではありません。パターンに一致する最短の文字列を返すため、余分なスクリプト要素をむさぼり食うことはありません。

于 2009-06-23T18:37:46.777 に答える
0

コードfooを含む文字列とします。次に、囲んでいるタグを次の方法で削除できます

foo = foo.substring(foo.indexOf('>') + 1, foo.lastIndexOf('<'))
于 2009-06-23T19:00:31.103 に答える