从字符串捕获到正则表达式

时间:2011-12-02 08:40:50

标签: php regex match

<h2 class="element">
name
</h2>
<div class="outerElement">
address
</div>
<h2 class="element">
name
</h2>
<div class="outerElement">
address
</div>

我需要获得一个正则表达式,它将在<h2 class="element">到下一个<h2 class="element">之间获得所有内容,所以我想出了这个:

preg_match_all('/div class="outerElement"(.*?)div class="outerElement"/', $content, $elements);

但由于某种原因它不起作用(我是否必须逃避双引号或问题是什么?

3 个答案:

答案 0 :(得分:2)

将“s”修饰符添加到这样的表达式中:

 '/div class="outerElement"(.*?)div class="outerElement"/s'

这是强制多行模式匹配所必需的。

答案 1 :(得分:0)

不要在这里使用正则表达式。 请改用PHP DOM解析。您的任务将更容易,也不容易出错。

http://www.php.net/manual/en/domdocument.getelementsbytagname.php

答案 2 :(得分:0)

以下正则表达式捕获第1组中的所有匹配项。

正如您所说,您需要使用preg_match_all迭代匹配。

为方便起见,这里是空白模式下的正则表达式。

(?xs)                       # modes: whitespace, dot matches new line
(?<=<h2[ ]class="element">) # is there an element h2 tag behind us
\W*                         # match any non-word char (greedy)
(\w.*?)                     # capture a word char followed by any char (lazy)
<h2[ ]class="element"       # match the next class element

这是一个使用此正则表达式并返回捕获的组的preg_match_all示例。我用你的样本字符串测试了它。有用。 :)

<?php 
$subject='<h2 class="element">
name
</h2>
<div class="outerElement">
address
</div>
<h2 class="element">
name
</h2>
<div class="outerElement">
address
</div>
';
preg_match_all('/(?xs)       # modes: whitespace, dot matches new line
(?<=<h2[ ]class="element">) # is there an element h2 tag behind us
\W*                         # match any non-word char (greedy)
(\w.*?)                     # capture a word char followed by any char (lazy)
<h2[ ]class="element"       # match the next class element
/s', $subject, $all_matches, PREG_OFFSET_CAPTURE | PREG_PATTERN_ORDER);
$size=count($all_matches[1]);
echo "<br />*****************<br />";
echo "Number of Matches: ".$size."<br />";
echo "*****************<br />";
for ($i=0;$i<$size;$i++) {
echo "Match number: ".($i+1)."<br />";
echo "At position: ".$all_matches[1][$i][1]."<br />";   
echo "Captured text: ".htmlentities($all_matches[1][$i][0])."<br />";
}
echo "End of Matches<br />";
echo "*****************<br /><br />";
?>

最后,这是输出:

*****************
Number of Matches: 1
*****************
Match number: 1
At position: 22
Captured text: name </h2> <div class="outerElement"> address </div>
End of Matches
*****************

如果我明白,这就是你要找的东西。