在PHP中匹配HTML标签之间的文本

25

我想在PHP中使用preg_match函数从HTML文档中解析以下内容中的"Desired text":

<p class="review"> Desired text </p>

通常我会使用simple_html_dom来处理这些事情,但在这种情况下无法使用(由于上述元素不出现在每个所需的div标签中,因此我被迫使用这种方法来准确地跟踪它何时不出现,然后根据情况调整我的simple_html_dom数组)。

不管怎样,这将解决我的问题。

非常感谢。

3个回答

75
preg_match("'<p class=\"review\">(.*?)</p>'si", $source, $match);
if($match) echo "result=".$match[1];

1
这不可能过度匹配吗?请看下面我的答案。 - Ross Snyder
4
由于惰性量词,它不会匹配过多。.*?会尽可能地匹配最少数量的字符,而.*会匹配尽可能多的字符。 - serg

11

如果你想返回多个匹配项,则需要使用preg_match_all()函数。然后,通过循环遍历第二个结果组($match[1]),可以获取标签之间的内容。

$source = "<p class=\"review\"> Desired text1 </p>".
"<p class=\"review\"> Desired text2 </p>".
"<p class=\"review\"> Desired text3 </p>";


    preg_match_all("'<p class=\"review\">(.*?)</p>'si", $source, $match);

    foreach($match[1] as $val)
    {
        echo $val."<br>";


    }

Outputs:

Desired text1
Desired text2
Desired text3 

7
如果您要匹配的字符串有多行,并且如下所示,该怎么办:

<p class="review"> Desired text1 </p>
<p class="review"> Desired text2 </p>
<p class="review"> Desired text3 </p>

这个模式只会匹配一次,而且匹配的结果是字符串中的所有内容。

我认为一个更好的模式是:

"'<p class=\"review\">([^<]*)</p>'si"

是的,谢谢。我已经尝试了过去两个小时的东西,最终意识到股票是在页面加载后使用JavaScript显示的 :((( 所以耶,这就是为什么脚本没有起作用的原因。谢谢大家。 - Adrian Tanase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接