正则表达式匹配第一个和最后一个标签之间的文本不起作用

时间:2015-06-25 08:39:12

标签: php regex

以下是示例

$lol = '<p>one</p>two</p>three<p>last</p><div>';

preg_match_all('/^<p>(.*?)<\/p>$/s',$lol,$mats);

var_dump($mats);

对于上面的字符串,我希望输出像one</p>two</p>three<p>last但它不适用于上面的代码。但是当我删除最后的<div>时,我得到正确的输出。可以解释为什么。< / p>

1 个答案:

答案 0 :(得分:1)

它不会起作用,因为最后没有关闭p标签。 $代表一行的结尾。如果您使用s修饰符,$将匹配文件的结尾。并且还使用.*按顺序进行贪婪的匹配。

preg_match_all('/^<p>(.*)<\/p>/s',$lol,$mats);

DEMO

使用\K

preg_match_all('/^<p>\K.*(?=<\/p>)/s',$lol,$mats);

\K会丢弃之前匹配的字符,以便在决赛中打印。所以在这里<p>\K,已经匹配的字符<p>被丢弃了。现在,匹配指针位于起始<p>标记之后。