正则表达式:删除白色字符

时间:2010-08-23 19:29:17

标签: php regex

我尝试从字符串中删除多个白色字符:

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

但是当我写的时候

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

有人可以解释为什么吗?

因为当我写/\s+/时,它必须与一个或多个白色字符匹配,为什么它不起作用?

由于

4 个答案:

答案 0 :(得分:5)

您想要匹配的空白字符的最小数量是多少?

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

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

另请注意,\s{2,}将使用单个空格替换$content = preg_replace('/\s+/', " ", $content);中的任何单个空格。换句话说,如果您的字符串包含单个空格,则结果将不会更改。

答案 1 :(得分:0)

我只是想补充一点,你/ s + /有时工作而不是其他工作的原因是正则表达式非常贪婪,所以它会尝试匹配一个或多个空格字符,并且尽可能多可以匹配。我认为这是你找到解决方案的原因。

抱歉,我还无法添加评论,或者我会将此评论添加到Daniel的答案中,这很好。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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