如何用preg_replace替换给定的html标签,空格和换行符的任意组合?

时间:2017-01-20 05:20:48

标签: php regex string replace preg-replace

我在PHP中使用以下正则表达式语法,以替换空的<p><span><div>标记,使用任何属性并覆盖任意数量的空格换行,其他内容:

$replacement = '\n&nbsp;\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">
&nbsp;
</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; (没有真正的内容)。但是,确实如此。有没有办法告诉它不要?

0 个答案:

没有答案