以下是示例
$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>
答案 0 :(得分:1)
它不会起作用,因为最后没有关闭p标签。 $
代表一行的结尾。如果您使用s
修饰符,$
将匹配文件的结尾。并且还使用.*
按顺序进行贪婪的匹配。
preg_match_all('/^<p>(.*)<\/p>/s',$lol,$mats);
或
使用\K
preg_match_all('/^<p>\K.*(?=<\/p>)/s',$lol,$mats);
\K
会丢弃之前匹配的字符,以便在决赛中打印。所以在这里<p>\K
,已经匹配的字符<p>
被丢弃了。现在,匹配指针位于起始<p>
标记之后。