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