【问题标题】:How replace all spaces inside HTML PRE elements with  如何将 HTML PRE 元素中的所有空格替换为
【发布时间】:2011-10-06 15:55:13
【问题描述】:

类似于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>

【问题讨论】:

标签: php regex


【解决方案1】:
$html = preg_replace(
      '#(\<pre[^>]*>)(.*)(</pre>)#Umie'
    , "'$1'.str_replace(' ', '&nbsp;', '$2').'$3'"
    , $html);

已经过测试,可以使用您提供的示例字符串。这是不贪心的,你不想替换&lt;/pre&gt;&lt;pre&gt; 之间的空格。如果&lt;pre&gt;&lt;/pre&gt; 部分跨越多行,也可以使用。

注意:如果您有像&lt;pre&gt; &lt;pre&gt; &lt;/pre&gt; &lt;/pre&gt; 这样的嵌套情况,这将失败。如果您希望能够解析它,则需要使用 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 或更高版本,早期版本不支持匿名函数。

【讨论】:

  • 你可以在替换字符串中放一个函数吗??文档中的什么地方是这样说的?
  • 那是因为正则表达式的 e 修饰符。这意味着结果字符串将被评估,因此只要您确保它生成正确的 PHP 代码,您还可以包含函数调用。另一种解决方案是使用preg_replace_callback 并指定回调函数。
  • 您需要添加's' single-line/dot-matches-all 修饰符以使点星跨越行。
【解决方案2】:
do
     $html = preg_replace('/(<pre.*>.*) (.*<\/pre>)/', '$1&nbsp;$2', $html, 1, $count);
while($count);

echo $html;

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

【讨论】:

  • .* 里面的&lt;pre.*&gt; 是贪婪的。如果你有 2 个&lt;pre&gt; 标签,它会消耗太多。
  • @Mark 在这种情况下贪婪并没有错,因为我把它放在一个循环中它仍然可以正常工作。这不是 Arjan 的一个很好的解决方案
  • ideone.com/I11cT Hrm....现在我真的很困惑。我认为第一次迭代将取代最后一个空间......为什么不这样做? (它仍然比它需要的多循环一次......虽然它根本不需要循环)
  • 啊……没关系。忘记了“点匹配所有”修饰符……这让我感到困惑! ideone.com/OyS9a 这符合我的预期。您会看到它还转换了跨度之间的空间。这就是为什么贪婪是坏的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2022-11-17
  • 2020-11-04
相关资源
最近更新 更多