与How replace all spaces inside HTML elements with using preg_replace?类似
除了我只想修改PRE标签之间的空格。例如:
<table atrr="zxzx"><tr>
<td>adfa a adfadfaf></td><td><br /> dfa dfa</td>
</tr></table>
<pre class="abc" id="abc">abc abc</pre>
<pre>123 123</pre>
将被转换为(注意pre标签可能包含属性,或者可能不包含):
<table atrr="zxzx"><tr>
<td>adfa a adfadfaf></td><td><br /> dfa dfa</td>
</tr></table>
<pre class="abc" id="abc">abc abc</pre>
<pre>123 123</pre>
答案 0 :(得分:4)
$html = preg_replace(
'#(\<pre[^>]*>)(.*)(</pre>)#Umie'
, "'$1'.str_replace(' ', ' ', '$2').'$3'"
, $html);
已经过测试,可以使用您提供的示例字符串。这是不合适的,您不希望替换</pre>
和<pre>
之间的空格。如果<pre></pre>
部分跨越多行,也可以使用。
注意:如果您有<pre> <pre> </pre> </pre>
等嵌套情况,则会失败。如果您希望能够解析它,则需要使用Document Object Model解析(X)HTML。
更新: 我做了一些基准测试,事实证明回调版本每100,000次迭代的速度提高了大约1秒,所以我想我也应该提一下这个选项。
$html = preg_replace_callback(
'#(\<pre[^>]*>)(.*)(</pre>)#Uim'
, function($matches){
return $matches[1].str_replace(' ', ' ', $matches[2]).$matches[3];
}
, $html);
这需要PHP 5.3或更新版本,早期版本不支持匿名函数。
答案 1 :(得分:0)
do
$html = preg_replace('/(<pre.*>.*) (.*<\/pre>)/', '$1 $2', $html, 1, $count);
while($count);
echo $html;
我不确定是否有更好的解决方案。我对所有preg函数都不是很熟悉。