我在PHP中使用以下正则表达式语法,以替换空的<p>
,<span>
和<div>
标记,使用任何属性并覆盖任意数量的空格或换行,其他内容:
$replacement = '\n \n';
$str = preg_replace('/<(p|span|div)\b[^>]*>(\n|[ ]|)+<\/(p|span|div)>/i', $replacement, $source);
这主要是有效的,但并不像我喜欢的那样。给定嵌套的空元素,它只匹配内部元素。与以下源字符串类似:
$source = '<p class="MsoNormal"><span style="font-size: 12pt; font-family: Arial, sans-serif;"></span></p>';
结果将是:
<p class="MsoNormal"> </p>
我想替换所有嵌套元素(空<p>
,<span>
和<div> tags,
以及任意数量{{}的任意组合1}}和whitespaces
)由linebreaks
的单个副本提供。 换句话说,我希望 regex 完全匹配源字符串。
应替换的字符串示例:
$replacement
应不替换的字符串示例:
<div><span class="x"><p></p></span></div>
<span class="x"> <p> </p></span> // contains spaces
<p class="y"></p>
<p class="y"> // contains linebreak
</p>
怎么做?
更新:我设法写了这个
<div><span class="z"><p>can't touch this</p></span></div> // not empty
正确匹配此...
(?:<(?:p|span|div)\b[^>]*>)+(?:\n|[ ]|)+(?:<\/(p|span|div)>)+
然而,它也是&#34;错误的&#34;匹配以下第二行:
<p class="MsoNormal"><span style="font-size: 12pt; font-family: Arial, sans-serif;"> </span></p>
不匹配尾随<p class="MsoNormal">Lorem ipsum dolor sit amet...
<span style="font-size: 7.5pt; font-family: Verdana, sans-serif;"></span></p> // this line
,除非整个</p>
元素为&#34;空&#34; (没有真正的内容)。但是,确实如此。有没有办法告诉它不要?