2012-01-05 7 views
0

2つのタグの間に取りたいhtmlがあります。しかし、ネストされたタグはhtmlに存在するので、最初のネストされたdivで返されるようには機能しません。REGEXパターン - どのように私は特定のタグをhtmlで一致させるのですか

基本的に私は私の正規表現が..

は別のリテラルテキスト文字列件まで任意の文字が続き、文字通りいくつかのテキストを一致させたいです。だから私の質問は、[^ <] *の次のdivが見えるまで続けることです。このよう <のdivのid = "テスト" [^ <] * <のdivのid = "TEST2" 一般的に

例のHTML

<div id="test" class="whatever"> 
    <div class="wrapper"> 
    <fieldset>Test</fieldset><div class="testclass">some info</div> 
    </div> 
    <!-- end test div--></div> 

</div> 
<div id="test2" class="endFind"> 
+0

あなたはどんな言語ですかを使用して、正規表現の言語に応じて形式の変化。 – Stefan

+0

[RegExはXHTML内蔵タグ以外のオープンタグと一致する可能性があります](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) –

答えて

1

として

、私はあなたが見てみたい疑いますあなたのプラットフォーム/言語でサポートされていると仮定して、あなたの正規表現の "貪欲"対 "怠け者"で。

たとえば、<div[^>]*>(.*?)</div>は、$ 1をdiv内のすべてのテキストと一致させますが、できるだけ小さくしようとします。 *?は「怠け者の星」と呼ぶ人もいます。

しかし、最初の入れ子divの開始前にあるdiv内のテキストを探しているようです。 <div[^>]*>(.*?)<div

greedy vs lazy hereを読んで、使用している言語がサポートされていることを確認してください。

$ php -r '$text="<div>Test<div>foo</div></div>\n"; print preg_replace("/<div[^>]*>(.*?)<div.*/", "\$1", $text);' 
Test 
$ 
0

RegexはHTMLを解析できません。これがアプリケーションの一部である場合、あなたは何か間違ったことをしています。あなたが絶対に文書を解析する必要がある場合は、html/xmlパーサーを使用してください。

スクラップしたものをスクリーニングしようとしていて、パーサを気にしたくない場合は、スクラップしているページの識別マークを探します。たとえば、埋め込みdivは、一致させたいdivの直前で終わる可能性があるので、代わりに</div></div>と一致させることができます。

また、ここにあなたの要件を満たす正規表現があります。しかし、それは非常に壊れやすいです:例えば、#テストの子どもが子供を持っている、HTMLが有効でない、あるいは何かが見逃された、など...#

/<div id="test"[^<]*(<([^ >]+).+<\/$2>[^<]*)*<\/div>/ 
関連する問題