我认为正则表达式可能会解决问题,但我无法想出一个有效的方法。我在 PHP 中有一些相当长的字符串需要清理。在某些情况下,
出现而不是单个空格字符,而在其他情况下
(等)出现。我想
用一个空格替换所有单一的出现,但将其他的留在原地,以便可以保持意图。
有什么想法吗?我认为可以在这里使用正则表达式,但我一直在努力制作一个!
您必须使用否定的lookbehind 和否定的lookahead 来确保您周围没有其他人
。
$str = preg_replace('~(?<! ) (?! )~i', ' ', $str);
有关环视的更多信息在这里。
使用匹配的显式正则表达式(not- ) (not- )
并将替换添加为$1 $2
(match 1 space match 2)。您可能必须not-
明确编码为([^;]|[^p];|[^s]p;|[^b]sp;|[^n]bsp;|[^&]nbsp;)
.
编辑:虽然 [negative] 环顾四周可能有用(而且总代码肯定更少),但您可能想要衡量每种方法的速度。我发现正则表达式中的某些机制与其他机制相比可能非常缓慢,尽管我不能直接谈论环视的速度。如果速度成为问题,您可以跳过正则表达式并使用和操作和测试的组合,strpos
这些substring
操作和测试通常比正则表达式快得多,即使创建起来更麻烦。我建议这样做只是因为您正在寻找一个非常明确的字符串;对于不太明确的字符串,正则表达式绝对是要走的路。
对于这种情况(在伪代码中),您的字符串strpos
搜索将很简单strpos($mystring, " ")
,一旦找到匹配项,请调用strpos($mystring, " ")
. 如果两个index
调用返回相同的值,您可以跳过此替换并搜索索引点之后的字符串(在 之后开始您的单
搜索indexDoubleFound + 12
,但在之后开始您的双重
搜索indexDoubleFound + 6
以确保您不会错过任何内容并且不会无意代替)。