2009-06-23 4 views
0

私はXHTMLドキュメント内で次き:このデータと一致する正規表現は何ですか?

<script type="text/javascript" id="JSBALLOONS"> 
    function() { 
     this.init = function() { 
      this.wAPI = new widgetAPI('__BALLOONS__'); 
      this.getRssFeed(); 
     }; 
    } 
</script> 

私は2つのスクリプト・タグの間にあるすべてのものを選択しようとしています。 idは、それが役立つ場合は常にJSBALLOONSになります。私はスクリプトタグを含むその選択方法を知っていますが、スクリプトタグを除いた内容の選択方法はわかりません。正規表現の結果は次のようになります。JavaScriptで

function() { 
     this.init = function() { 
      this.wAPI = new widgetAPI('__BALLOONS__'); 
      this.getRssFeed(); 
     }; 
    } 
+1

こんにちは、私の感謝は司会者によって削除されました! FYI、この記事の終わりには次のものが含まれていました:Thanks、Pete。私は司会者が特に私の礼儀を削除して私の記事をニックピッキング嫌う。 – slypete

答えて

8

(。特に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フレームワークを使用したほうが良いかもしれません。)

+0

こんにちは、ありがとう。これはまさに私が持っているものですが、スクリプトタグを含んでいます。 $ 1の意味を説明できますか?私はよく知らない。ありがとう! – slypete

+0

@slypete、どの言語やツールで正規表現を実行していますか? – molf

+0

@molf、私はjavascriptとjQueryを使用しています。 var javascript = this.data.match(/ )+ id = "JSBALLOONS">([\ S \ s] *?)<\/script>/ig); this.javascript = eval( '(' + javascript + ')'); – slypete

2

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

、$ 1 $ 2はマッチした文字列で、最初のキャプチャグループでマッチした文字列を保持している魔法の変数である -

(私は構文を忘れてしまったキャプチャグループを定義せずに、サブ式を定義する方法があります。)他の言語では、返されたmatchオブジェクトのメソッドを呼び出して、N番目のキャプチャグループを取得する必要があります。

しかし、モルフの溶液に戻ります。複数のスクリプト要素を持っている場合、それは貪欲なので、この間違ったパターンは、説明する価値があるポイントを、それらすべてを飲み込んでますが、この場合

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

:彼は、代わりにこのパターンを使用するように言ったとします。このパターンは、最初の開始タグで始まり、終了タグに一致し、続行し、最後に一致します。 molfの解決法の魔法は、それを非貪欲にする疑問符(。*?)です。それはパターンと一致する最短の文字列を返します。したがって、余分なスクリプト要素を嫌うことはありません。

+0

ありがとう、非常に便利です! – slypete

2

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

document.getElementById("JSBALLOONS") 

編集:あなたのコメントに関しては、私はJavaScriptやjQueryを使っての経験がないが、いくつかの検索の後、私はこれらの線に沿って何かが動作するはずだと思う:

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

缶誰かがこれを正して正しい?

+0

このコンテンツはDOM上に存在しないため、うまくいきません。 – slypete

+0

ドキュメントは、選択したものを抽出する必要がある文字列にリモートで読み込まれます。私は正規表現が最良の解決策ではないことを認識しています。あなたが他の実用的な解決策を知っていれば教えてください。ありがとう! – slypete

+0

再び、動作しません。私はこれを試した。理由について私の他のより一般的な質問を見てください:http://stackoverflow.com/questions/1034881/what-is-the-best-practice-for-parsing-remote-content-with-jquery うまくいけば誰かがこの質問の答えを考え出すことができます。 – slypete

0

fooをコードを含む文字列とします。次に、囲むタグを取り除くことができます

foo = foo.substring(foo.indexOf('>') + 1, foo.lastIndexOf('<'))