5

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

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

4

2 回答 2

12

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

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

有关环视的更多信息在这里

于 2013-07-19T17:46:08.953 回答
1

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

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

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

于 2013-07-19T17:48:56.790 回答