2014-04-09 47 views
0

,如果你看看這個標籤:preg_match_all skippes一個嵌套的標籤

$text = '<div class="inner"> 
    <div class="left"> 
     <h4>text </h4> 
     <p>Abdijstreet 42b<br>2000 city </p> 
    </div> 
    <div class="right"> 
     <span class="red">10:00 - 14:00</span> 
    </div> 
</div>' 

我用這個來的preg_match:

preg_match_all("'<div class=\"inner\">(.*?)</div>'si", $text, $match); // de ul tags 

      $match[1] = array_splice($match[0], 0); 

     foreach($match[1] as $val) // hele pagina 
     { 
       echo $val; 
       } 

嗯,我嘗試了很多東西,但我只得到什麼之間,從來沒有什麼我需要,我做錯了什麼?

回答

0

您是否想要在開始和結束div標籤之間獲得所有內容?如果是這樣,那麼你真的很接近。您只需從表達式中刪除問號?即可。問號告訴腳本一旦找到REGEX中的下一個項目就停止匹配。在這種情況下,下一個項目是一個閉合的div標籤。所以一旦找到它,它就會停止。如果將其保留,它將保持匹配狀態,直到它找到它可以找到的最後一個div標籤。

$text = '<div class="inner"> 
    <div class="left"> 
     <h4>text </h4> 
     <p>Abdijstreet 42b<br>2000 city </p> 
    </div> 
    <div class="right"> 
     <span class="red">10:00 - 14:00</span> 
    </div> 
</div>'; 

preg_match_all("'<div class=\"inner\">(.*)</div>'si", $text, $match); 

print "<pre><font color=red>"; print_r($match); print "</font></pre>"; 

如果你想每個項目拉出來在一個div,那麼你可能要考慮使用DOM,而不是正則表達式來解決這個問題。但是,由於您使用標籤,然後在這裏它是在正則表達式:

preg_match_all('~<div class="(?!inner).*?>\K(.*?)(?=</div>)~ims', $text, $matches); 

print "<PRE><FONT COLOR=BLUE>"; print_r($matches[1]); print "</FONT></PRE>"; 

這就給了你這樣的:

Array 
(
    [0] => 
      <h4>text </h4> 
      <p>Abdijstreet 42b<br>2000 city </p> 

    [1] => 
      <span class="red">10:00 - 14:00</span> 

) 

正則表達式的說明:

<div class=" (?!inner) .*? > \K (.*?) (?=</div>) 
    ^  ^ ^^^ ^  ^
     1   2  3 4 5  6   7 
  1. <div class="尋找文字開放的div標籤<div,隨後一個空格,然後是單詞類,後跟一個等號,後跟一個引號。
  2. (?!inner)這是一個負面預測(?!),確保單詞inner接下來不會出現。
  3. .*?匹配任何一個字符.,零次或多次*,一直到它碰到我們的正則表達式?中的下一項。在這種情況下,一旦它找到一個閉合的HTML括號就會停止。
  4. >查找一個閉合的HTML括號。
  5. \K這會告訴表達式忘記它到目前爲止匹配的所有內容,然後再次從這裏開始匹配。這基本上確保表達式的第一部分存在,但不存儲它供我們使用。
  6. (.*?)與3號相同,只是我們在其周圍使用括號(),以便我們可以捕獲它並稍後使用它。
  7. (?=</div>)這是一個積極的前瞻(?=),確保關閉div標記</div>即將在表達式結尾,但不捕獲它。

Here is a working demo of the code above