我需要插入<p>
标签来包围 HTML 片段中的每个列表元素。这不能创建嵌套段落,这就是为什么我想使用前瞻/后瞻断言来检测内容是否已经包含在段落标签中。
到目前为止,我已经想出了以下代码。
此示例使用否定的lookbehind 断言来匹配每个</li>
结束标记,该结束标记前面没有</p>
结束标记和任意空格:
$html = <<<EOF
<ul>
<li>foo</li>
<li><p>fooooo</p></li>
<li class="bar"><p class="xy">fooooo</p></li>
<li> <p> fooooo </p> </li>
</ul>
EOF;
$html = preg_replace('@(<li[^>]*>)(?!\s*<p)@i', '\1<p>', $html);
$html = preg_replace("@(?<!</p>)(\s*</li>)@i", '</p>\1', $html);
echo $html, PHP_EOL;
令我惊讶的是,结果如下:
<ul>
<li><p>foo</p></li>
<li><p>fooooo</p></li>
<li class="bar"><p class="xy">fooooo</p></li>
<li> <p> fooooo </p> </p> </li>
</ul>
开始标签的插入按预期工作,但请注意在最后一个列表元素中插入的附加标签!</p>
有人可以解释为什么\s*
当使用否定后向断言时,正则表达式中的空格 () 会被完全忽略吗?
更重要的是:我还能尝试什么来实现上述目标?