代码之家  ›  专栏  ›  技术社区  ›  Simon

regex:删除白色字符

  •  2
  • Simon  · 技术社区  · 16 年前

    我试图从字符串中删除多个以上的白色字符:

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

    但当我写的时候

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

    有人能解释为什么吗?

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

    谢谢

    4 回复  |  直到 16 年前
        1
  •  5
  •   Daniel Vandersluis    16 年前

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

    \s+ 等于 \s\s* --一个必需的空白字符,后面跟着任意数量的空白字符。

    \s\s+ 等于 \s\s\s* —— 二 强制的空白字符后面再跟任何数字(如果这是您想要的,它可能会更清楚,因为 \s{2,} )

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

        2
  •  0
  •   Christa    16 年前

    我只是想补充一点,为什么您的/S+/有时会工作,而不是其他的工作,是因为正则表达式非常贪婪,所以它将尝试匹配一个或多个空格字符,并且尽可能多地匹配。我想这就是你在寻找解决方案时被绊倒的地方。

    抱歉,我还不能添加评论,否则我会将此评论添加到丹尼尔的回答中,这很好。

        3
  •  0
  •   LarsH    16 年前

    您使用的是ungreedy选项(/u)?它在代码中没有这样说,但如果是这样,它将解释为什么第一个preg_replace()将每个单独的空间替换为一个单独的空间(没有更改)。在这种情况下,第二个preg_replace()将用一个空格替换每个双空格。如果你在一个由四个空格组成的字符串上尝试第二个空格,结果是一个双空格,我会怀疑这是不恰当的。

        4
  •  0
  •   Quamis    16 年前

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