您是否想要在开始和结束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