如何用空格替换单个,但是,如果有多个s?

时间:2013-07-19 17:41:11

标签: php html regex

我假设一个正则表达式可能会成功,但我无法想出一个有效的方法。我在PHP中有一些相当长的字符串,我需要清理它。在某些情况下, 代替单个空格字符,而其他属性   (等)出现。我想用空格替换所有单 次出现,但保留其他空格以便保持意图。

有什么想法?我假设可以在这里使用正则表达式,但我一直在努力制作一段时间!

2 个答案:

答案 0 :(得分:12)

您必须使用负面的lookbehind和负向前瞻,以确保您没有其他 

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

有关外观here的更多信息。

答案 1 :(得分:1)

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

编辑:虽然[负]外观可能有用(当然总代码较少),但您可能需要测量每种方法的速度。我发现正则表达式中的某些机制与其他机制相比可能会非常缓慢,尽管我不能直接说出外观的速度。如果速度成为问题,您可以跳过正则表达式并使用strpossubstring操作和测试的组合,这些操作和测试通常比正则表达式快得多,即使它们创建起来比较麻烦。我建议这只是因为你有一个非常明确的字符串,你正在寻找;如果没有明确的字符串,正则表达式绝对是可行的方法。

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