正则表达式:删除白字
我试图从我的字符串中删除一个以上的白色大字:正则表达式:删除白字
$content = preg_replace('/\s+/', " ", $content); //in some cases it doesn't work
,但是当我写
$content = preg_replace('/\s\s+/', " ", $content); //works fine
有人能解释一下为什么?
,因为当我写/\s+/
为什么它不工作,它必须匹配所有与一个或多个空白字符,?
感谢
什么是你想匹配的空白字符的最小数目?
\s+
相当于\s\s*
- 一个强制性的空白字符,后跟任意数量的更多字符。
\s\s+
相当于\s\s\s*
- 2个强制性空白字符后跟任意数量更多(如果这是你想要的东西,它可能是更清晰的\s{2,}
)。
另外请注意,$content = preg_replace('/\s+/', " ", $content);
将用一个空格代替任何单个空格$content
。换句话说,如果你的字符串只有包含单个空格,结果将不会改变。
我只是想补充到,之所以你/ S + /工作有时而不是别人,就是正则表达式是非常贪婪的,所以它会尝试匹配一个或多个空格字符,以及多达它可以匹配。我认为这是你找到解决方案绊倒的地方。
对不起,我还没有能够添加注释,或者我刚才说丹尼尔的回答此评论,这是很好的。
我认为这会产生相反的效果。一个贪婪的正则表达式可以匹配尽可能多的空间,并用一个空格来替换它们,从而完成OP所需的操作。 _ungreedy_ regexp会导致问题行为。对? – LarsH 2010-08-23 19:46:37
你使用Ungreedy选项(/ U)吗?它没有在你的代码中这么说,但是如果是这样的话,它可以解释为什么第一个preg_replace()用一个空格替换每个单独的空间(没有改变)。在这种情况下,第二个preg_replace()将用一个空格替换每个双空间。如果你尝试第四个空格的字符串,结果是双空间,我会怀疑不合理。
尝试preg_replace("/([\s]{2,})/", " ", $text)
没有必要在一个字符类中粘贴'\ s',或者将整个表达式粘在一个组中。 '/ \ s {2,} /'相当于,更短更清晰。 – 2010-08-23 19:46:42
我认为,当一切都在其组或其他类型的分离时,它们看起来更清晰。但是,是的,它们是相同的。 – Quamis 2010-08-24 11:03:07
给我们一个片段,重现此问题。要不然。 – polygenelubricants 2010-08-23 19:33:46
对不起,问题出在另一个地方。 我在将数据插入数据库时失去了价值。非常非常奇怪的行为,我会找到原因并更新问题。 – Simon 2010-08-23 20:02:16