2010-08-23 101 views
2

我试图从我的字符串中删除一个以上的白色大字:正则表达式:删除白字

$content = preg_replace('/\s+/', " ", $content); //in some cases it doesn't work 

,但是当我写

$content = preg_replace('/\s\s+/', " ", $content); //works fine 

有人能解释一下为什么?

,因为当我写/\s+/为什么它不工作,它必须匹配所有与一个或多个空白字符,?

感谢

+1

给我们一个片段,重现此问题。要不然。 – polygenelubricants 2010-08-23 19:33:46

+0

对不起,问题出在另一个地方。 我在将数据插入数据库时​​失去了价值。非常非常奇怪的行为,我会找到原因并更新问题。 – Simon 2010-08-23 20:02:16

回答

5

什么是你想匹配的空白字符的最小数目?

\s+相当于\s\s* - 一个强制性的空白字符,后跟任意数量的更多字符。

\s\s+相当于\s\s\s* - 2个强制性空白字符后跟任意数量更多(如果这是你想要的东西,它可能是更清晰的\s{2,})。

另外请注意,$content = preg_replace('/\s+/', " ", $content);将用一个空格代替任何单个空格$content。换句话说,如果你的字符串只有包含单个空格,结果将不会改变。

+0

最小数字是2,但我没有看到使用'/ \ s + /'结构的任何潜在风险,但是在某些情况下它删除了一部分字符串。我在myslq数据库中使用这个结构,并且在某些领域我遇到了这样的问题。 – Simon 2010-08-23 19:38:59

+0

如上所述,'/ \ s + /'不符合2空间要求。 – 2010-08-23 19:39:45

+0

好的,但是如何删除其他词,我无法理解。 – Simon 2010-08-23 19:44:27

0

我只是想补充到,之所以你/ S + /工作有时而不是别人,就是正则表达式是非常贪婪的,所以它会尝试匹配一个或多个空格字符,以及多达它可以匹配。我认为这是你找到解决方案绊倒的地方。

对不起,我还没有能够添加注释,或者我刚才说丹尼尔的回答此评论,这是很好的。

+1

我认为这会产生相反的效果。一个贪婪的正则表达式可以匹配尽可能多的空间,并用一个空格来替换它们,从而完成OP所需的操作。 _ungreedy_ regexp会导致问题行为。对? – LarsH 2010-08-23 19:46:37

0

你使用Ungreedy选项(/ U)吗?它没有在你的代码中这么说,但是如果是这样的话,它可以解释为什么第一个preg_replace()用一个空格替换每个单独的空间(没有改变)。在这种情况下,第二个preg_replace()将用一个空格替换每个双空间。如果你尝试第四个空格的字符串,结果是双空间,我会怀疑不合理。

0

尝试preg_replace("/([\s]{2,})/", " ", $text)

+0

没有必要在一个字符类中粘贴'\ s',或者将整个表达式粘在一个组中。 '/ \ s {2,} /'相当于,更短更清晰。 – 2010-08-23 19:46:42

+0

我认为,当一切都在其组或其他类型的分离时,它们看起来更清晰。但是,是的,它们是相同的。 – Quamis 2010-08-24 11:03:07