Php 正则表达式匹配第一个和最后一个标记之间的文本无效

Php 正则表达式匹配第一个和最后一个标记之间的文本无效,php,regex,Php,Regex,下面是一个例子 $lol = '<p>one</p>two</p>three<p>last</p><div>'; preg_match_all('/^<p>(.*?)<\/p>$/s',$lol,$mats); var_dump($mats); $lol='123last; preg_match_all('/^(.*?$/s',$lol,$mats); var_dump($mats); 对于上

下面是一个例子

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

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

var_dump($mats);
$lol='1

2

3last

; preg_match_all('/^(.*?$/s',$lol,$mats); var_dump($mats);

对于上面的字符串,我想要像
one

two

threelast
这样的输出,但是对于上面的代码它不起作用。但是当我在最后删除
时,我得到了正确的输出。有人能解释一下原因吗。

它不起作用,因为最后没有结束p标记<代码>$表示行尾。如果使用
s
修饰符,
$
将匹配文件的结尾。并使用
*
进行贪婪匹配

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

\K
在最终打印时放弃先前匹配的字符。因此在这里,已经匹配的字符被丢弃。现在,匹配指针正好位于起始标记的后面。

贪婪是必要的,这样op将得到
1

2

3最后一个

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