【问题标题】:How can I replace single  's with a space but, not if there are multiple  s?如何用空格替换单个 ,但如果有多个 s 则不行?
【发布时间】:2013-07-19 02:33:09
【问题描述】:

我认为正则表达式可能会解决问题,但我无法想出一个有效的方法。我在 PHP 中有一些相当长的字符串需要清理。在某些情况下,  出现而不是单个空格字符,而在其他情况下,    (等)出现。我想用空格替换所有单一的   出现,但将其他的留在原处,以便保持预期。

有什么想法吗?我认为这里可以使用正则表达式,但我一直在努力制作一个!

【问题讨论】:

  • 你想用什么替换空格 +  ?
  • Swishhhhh-HoHe-Swishhhhh-这里有人吗?您是在代码编辑器中执行此操作吗?在这种情况下,您的编辑器是什么?
  • 另一种想法-使用preg_replace_callback('#( )+#'),让回调函数检查它是否匹配一个 或多个并相应地返回替换字符串。

标签: php html regex


【解决方案1】:

您必须使用否定的lookbehind和否定的lookahead来确保您周围没有其他 

$str = preg_replace('~(?<!&nbsp;)&nbsp;(?!&nbsp;)~i', ' ', $str);

更多关于lookarounds的信息here

【讨论】:

  • 负面的外观效果很好,我只需要在导入文本时运行一次,所以我不太担心性能。
【解决方案2】:

使用匹配(not-&amp;nbsp;)&amp;nbsp;(not-&amp;nbsp;) 的显式正则表达式并将替换添加为$1 $2(匹配1 空格匹配2)。您可能必须将not-&amp;nbsp; 明确编码为([^;]|[^p];|[^s]p;|[^b]sp;|[^n]bsp;|[^&amp;]nbsp;)

编辑:虽然 [负面] 环顾四周可能有用(而且总代码肯定更少),但您可能希望衡量每种方法的速度。我发现正则表达式中的某些机制与其他机制相比可能非常缓慢,尽管我不能直接谈论环视的速度。如果速度成为问题,您可以跳过正则表达式并使用 strpossubstring 操作和测试的组合,这通常比正则表达式快得多,即使创建起来更麻烦。我建议这样做只是因为您正在寻找一个非常明确的字符串;对于不太明确的字符串,正则表达式绝对是要走的路。

对于这种情况(在伪代码中),您的字符串 strpos 搜索将是一个简单的 strpos($mystring, "&amp;nbsp;"),一旦找到匹配项,请调用 strpos($mystring, "&amp;nbsp;&amp;nbsp;")。如果两个index 调用返回相同的值,您可以跳过此替换并在索引点之后搜索字符串(在indexDoubleFound + 12 之后开始您的单&amp;nbsp; 搜索,但在indexDoubleFound + 6 之后开始您的双&amp;nbsp; 搜索以确保您不会遗漏任何内容并且不会无意更换)。

【讨论】:

  • 更新了我的答案以在 PHP 中使用正确的函数名称(strpos 而不是 index)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
相关资源
最近更新 更多