2011-02-03 8 views
0

私は、次の入力のみ次のdivは(div要素を含まない)まで、正規表現がコンテンツを取得する

<div style="s1">title1</div> 
<div style="s1">content1</div> 
<div style="s1">title2</div> 
<div style="s1">content2</div> 

を持っている私のようなものが必要になり、私はtitle1title2を知っていると私はcontent1とcontent2

を収集したいですこの:

<div style="s1">title1</div>.*?<div style="s1">(.*?)</div> 

が、正規表現は貪欲であるため、それは

を返すので、それは最後まで一致しました
content1</div> 
    <div style="s1">title2</div> 
    <div style="s1">content2 

パターンにマッチに含めないタグのリストを追加したいと思います。以下のような

何か:私は含まれていないものを[^<div]で参照する

<div style="s1">title1</div>.*?<div style="s1">(.*?[^<div])</div> 

。これは複数のオプションにする必要があります。おそらく|

どうすればいいですか?

答えて

4

Obligitory link。それが邪魔であることを今

、単にいくつかのDOM操作とXPathの操作を行います。

$dom = new DOMDocument(); 
    @$dom->loadHTML($html); 
    $x = new DOMXPath($dom);   

    foreach($x->query("//div") as $node) 
    { 
     if (trim($node->textContent) == 'title1') 
     { 
      $content['title1'] = $node->nextSibling->textContent; 
     } 
    } 

は、今では簡単ではありませんでしたか?だから、html kayを正規表現する必要はありませんか?

+0

+1真実のストーリー...正規表現は人々に魔法のような暖かなファジー感情を与えますが、DOMの解析にはひどいです。 –

0
 
<div style="s1">title1</div>.*<div style="s1">(([^<]|<[^\/])*)</div> 

これを試してみてください - それは<または< /続かないを除いて何かを見つけることを意味します - あなたがしたい場合、私はサブのdivのためにそこに条件を追加することができますなど