我假设一个正则表达式可能会成功,但我无法想出一个有效的方法。我在PHP中有一些相当长的字符串,我需要清理它。在某些情况下,
代替单个空格字符,而其他属性
(等)出现。我想用空格替换所有单
次出现,但保留其他空格以便保持意图。
有什么想法?我假设可以在这里使用正则表达式,但我一直在努力制作一段时间!
答案 0 :(得分:12)
您必须使用负面的lookbehind和负向前瞻,以确保您没有其他
。
$str = preg_replace('~(?<! ) (?! )~i', ' ', $str);
有关外观here的更多信息。
答案 1 :(得分:1)
使用与(not- ) (not- )
匹配的显式正则表达式,并将替换为$1 $2
(匹配1个空格匹配2)。您可能必须将not-
明确地编码为([^;]|[^p];|[^s]p;|[^b]sp;|[^n]bsp;|[^&]nbsp;)
。
编辑:虽然[负]外观可能有用(当然总代码较少),但您可能需要测量每种方法的速度。我发现正则表达式中的某些机制与其他机制相比可能会非常缓慢,尽管我不能直接说出外观的速度。如果速度成为问题,您可以跳过正则表达式并使用strpos
和substring
操作和测试的组合,这些操作和测试通常比正则表达式快得多,即使它们创建起来比较麻烦。我建议这只是因为你有一个非常明确的字符串,你正在寻找;如果没有明确的字符串,正则表达式绝对是可行的方法。
对于此实例(在伪代码中),您的字符串strpos
搜索将简单为strpos($mystring, " ")
,一旦找到匹配项,请致电strpos($mystring, " ")
。如果两个index
调用返回相同的值,则可以跳过此替换并在索引点后搜索字符串(在
之后开始单indexDoubleFound + 12
次搜索,但启动双
1}}在indexDoubleFound + 6
之后搜索以确保您不会错过任何内容并且无意中替换。