如何用HTML替换HTML PRE元素中的所有空格

时间:2011-07-16 07:43:46

标签: php regex

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&nbsp;abc</pre>
<pre>123&nbsp;123</pre>

2 个答案:

答案 0 :(得分:4)

$html = preg_replace(
      '#(\<pre[^>]*>)(.*)(</pre>)#Umie'
    , "'$1'.str_replace(' ', '&nbsp;', '$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(' ', '&nbsp;', $matches[2]).$matches[3];
      }
    , $html);

这需要PHP 5.3或更新版本,早期版本不支持匿名函数。

答案 1 :(得分:0)

do
     $html = preg_replace('/(<pre.*>.*) (.*<\/pre>)/', '$1&nbsp;$2', $html, 1, $count);
while($count);

echo $html;

我不确定是否有更好的解决方案。我对所有preg函数都不是很熟悉。