PHP实现移除<p与p&gt间内容的方法问询
解决PHP中移除转义HTML里的
<p>标签及其内容的问题 你的核心问题在于正则表达式的写法有误,尤其是对\p的误用,以及没有匹配完整的转义<p>标签结构。我们来一步步修正:
问题分析
你要处理的是被双重转义的HTML内容(比如&lt;p对应转义后的<p),目标是移除所有从转义的<p开始到</p>结束的整个片段。你的原正则/&lt.*?\p&gt|\s*/有两个明显问题:
\p是Unicode字符属性匹配符(比如\p{L}匹配字母),不是字面量的p,所以无法正确匹配到p&gt里的p;- 只匹配到
p&gt就停止,没有覆盖后面的内容(比如- NEW&lt;/p&gt;),而且|\s*会错误删除所有空白字符,这应该不是你想要的。
正确实现方案
如果你的需求是移除所有转义的<p>标签及其内部内容,可以使用下面的正则:
// 定义正则模式 $pattern = '/&lt;p.*?&lt;\/p&gt;/is'; // 执行替换 $cleanedContent = preg_replace($pattern, '', $_input);
正则解释:
&lt;p:精准匹配转义后的<p开头;.*?:非贪婪模式匹配任意字符(避免过度匹配到后面的其他标签);&lt;\/p&gt;:精准匹配转义后的</p>结尾;i:可选,忽略大小写(如果你的标签可能有<P>这种写法);s:让.匹配换行符(如果<p>内容跨多行)。
测试效果
将你提供的输入代入后,会得到干净的结果:
<li class="level1 nav-2-1 first"> <a href="http://dev.example.com/women/"><span>Women </span></a> </li> <li class="level1 nav-2-2"> <a href="http://dev.example.com/men"><span>Men</span></a> </li>
如果你只想移除&lt;p和p&gt之间的内容(保留标签框架)
如果你的需求是仅删除标签内的属性和内容,保留&lt;p和p&gt,可以用这个正则:
$pattern = '/&lt;p\K.*?(?=p&gt)/is'; $cleanedContent = preg_replace($pattern, '', $_input);
解释:
\K:重置匹配起点,不会替换前面的&lt;p;(?=p&gt):正向预查,匹配到p&gt为止,不会替换这个结尾部分。
内容的提问来源于stack exchange,提问作者Holly
相关产品推荐
相关产品推荐

