在第一个和最后一个标记之间匹配文本的regex不起作用


regex to match text inbetween first and last tag not working

以下是示例

$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标记。$表示一行的末尾。如果使用s修饰符,则$将与文件的末尾相匹配。并且还使用.*来进行贪婪匹配。

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

演示

使用'K

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

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