【问题标题】:Matching a space in regex匹配正则表达式中的空格
【发布时间】:2010-10-08 05:52:39
【问题描述】:

如何匹配 PHP 正则表达式中的空格字符?

我的意思是像“gavin schulz”,两个词之间的空格。我使用正则表达式来确保我只允许字母、数字和空格。但我不知道如何找到空间。这就是我现在拥有的:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);

【问题讨论】:

  • 嗯...关于匹配“a”或“b”也没有问题... ;)
  • 你应该看到regex examples

标签: php regex


【解决方案1】:

如果您正在寻找一个空格,那就是" "(一个空格)。

如果您要查找一个或多个,则为" *"(即两个空格和一个星号)或" +"(一个空格和一个加号)。

如果您正在寻找通用间距,请使用 "[ X]""[ X][ X]*""[ X]+" 其中 X 是物理制表符(在所有这些示例中每个前面都有一个空格)。

这些将在我见过的每一个*正则表达式引擎中工作(其中一些甚至没有一个或多个"+" 字符,呃)。

如果您知道您将使用更现代的正则表达式引擎之一,"\s" 及其变体就是您的最佳选择。此外,我相信单词边界也与行首和行尾相匹配,这在您查找可能出现的单词前后没有空格时很重要。

对于 PHP,this page 可能会有所帮助。

从您的编辑中,您似乎想要删除所有无效字符。开头是(注意正则表达式内的空格):

$newtag = preg_replace ("/[^a-zA-Z0-9 ]/", "", $tag);
#                                    ^ space here

如果您还想使用技巧来确保每个单词之间只有一个空格,并且在开头或结尾处没有空格,那会稍微复杂一些(可能是另一个问题),但基本思路是:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end

【讨论】:

  • 他原来的正则表达式似乎想替换“”字符。您正在否定该空间,因此他的空间不会按预期“删除”。
  • 引用:“只允许字母、数字和空格”,Gavin 的原始 RE 是错误的(这就是他问这个问题的原因)。我的 RE 会删除不属于其中的所有内容。
  • 为什么空格必须在匹配模式的末尾而不是在中间?
  • @warren,它没有。 'space here' 评论并没有说明 空间的去向,而是说明那里有一个空间(以防读者没有意识到)。
  • @Mike,不,事实并非如此。这里的目的是替换集合A-Za-z... 中所有not 的字符。方括号内的插入符号说明了这一点。将插入符号移出方括号会将其含义更改为匹配字符串开头的集合 in 中的字符。
【解决方案2】:

备忘单

这里有一份关于正则表达式中空格的所有知识的小备忘单:

[[:blank:]]

仅限空格或制表符,而不是换行符。和写[ \t]一样。

[[:space:]] & \s

[[:space:]]\s 是一样的。它们都将匹配任何空白字符空格、换行符、制表符等...

\v

匹配垂直 Unicode 空白。

\h

匹配 水平 空格,包括 Unicode 字符。它还将匹配空格、制表符、不间断/数学/表意空格。

x (eXtended flag)

忽略所有空格。请记住,这是一个标志,因此您将其添加到正则表达式的末尾 喜欢/hello/gmx。此标志将忽略正则表达式中的空格。

例如,如果您编写像/hello world/x 这样的表达式,它将匹配helloworld,但不匹配hello world。扩展标志还允许在您的正则表达式中使用 cmets。

示例

/helloworld #hello this is a comment/

如果需要使用空格,可以使用\ 来匹配空格。

【讨论】:

  • 不完全是“一切”:您还需要知道 \s 是一个字符类,因此可能需要也可能不需要包装在 []() 中,具体取决于语言/方言。
  • \s 和 [ ] 之间有什么区别(即方括号中的空格或字符集中的空格)。它们都可以互换吗?我可以使用两者中的任何一个来检测两个单词之间的空格吗?
【解决方案3】:

要精确匹配空格字符,您可以使用八进制值\040 (Unicode characters displayed as octal) 或十六进制值\x20 (Unicode characters displayed as hex)。

这里是正则表达式语法参考:https://www.regular-expressions.info/nonprint.html

【讨论】:

    【解决方案4】:

    在 Perl 中,开关是 \s(空格)。

    【讨论】:

    • 这是不正确的 - 它收集所有空格,而不仅仅是空格字符。
    • 但是问题是用 PHP 标记的,而不是 Perl。
    • @PeterMortensen Perl 和 PHP 使用相同的正则表达式引擎 PCRE,因此这将在 PHP 中工作。
    【解决方案5】:

    我正在使用正则表达式来确保我 只允许字母、数字和空格

    那么它就像在你已经拥有的东西上添加一个空格一样简单:

    $newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);
    

    (注意,我删除了似乎无意的s|?当然s是多余的;如果需要,您可以恢复|

    如果您特别想要 *a* 空间,如 一个空间,您将需要比这更复杂的表达式,并且可能需要考虑单独的非正则表达式逻辑。

    【讨论】:

      【解决方案6】:

      在我看来,在这种情况下使用 REGEX 会有点矫枉过正。为什么不只是 strpos 来查找空格字符。此外,正则表达式中的空格字符没有什么特别之处,您应该能够像搜索任何其他字符一样搜索它。也就是说,除非您禁用了模式空白,在这种情况下几乎没有必要这样做。

      【讨论】:

        【解决方案7】:

        您也可以使用 \b 作为单词边界。对于名称,我会使用这样的名称:

        [^\b]+\b[^\b]+(\b|$)
        

        EDIT将其修改为 Perl 示例中的正则表达式

        if( $fullname =~ /([^\b]+)\b[^\b]+([^\b]+)(\b|$)/ ) {
         $first_name = $1;
         $last_name = $2;
        }
        

        再次编辑根据您的需要:

        $new_tag = preg_replace("/[\s\t]/","",$tag);
        

        【讨论】:

        • 单词边界匹配器\b也匹配连字符
        【解决方案8】:

        这样使用它可以留出一个空格。

        $newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
        

        【讨论】:

          【解决方案9】:

          我正在尝试 [[:space:]] 在 WordPress 中的博主使用非标准空格字符的情况下。它看起来会起作用。

          【讨论】:

          • “WordPress 中的博主”是什么意思?你能详细说明一下吗?
          • @PeterMortensen 这是我为一家主要出版商开发和支持大量 WordPress 博客的时候。作者写的帖子带有一些意想不到的空格字符。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-05
          • 1970-01-01
          • 2013-02-26
          • 2018-02-16
          • 2020-08-22
          • 2014-03-25
          相关资源
          最近更新 更多