如何匹配 PHP 正则表达式中的空格字符?
我的意思是像“gavin schulz”,两个词之间的空格。我使用正则表达式来确保我只允许字母、数字和空格。但我不知道如何找到空间。这就是我现在所拥有的:
$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);
如果您正在寻找一个空格,那就是 " "
(一个空格)。
如果您要查找一个或多个,则为 " *"
(即 两个 个空格和一个星号)或 " +"
(一个空格和一个加号)。
如果您正在寻找公共间距,请使用 "[ 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
备忘单
这是您需要了解的有关正则表达式中空格的所有内容的小备忘单:
[[:空白的:]]
仅限空格或制表符,而不是换行符。与写 [ \t]
相同。
[[:space:]] & \s
[[:space:]]
和 \s
相同。它们都将匹配任何空白字符空间、换行符、制表符等......
\v
匹配垂直 Unicode 空白。
\H
匹配水平空白,包括 Unicode 字符。它还将匹配空格、制表符、不间断/数学/表意空格。
x(扩展标志)
忽略所有空格。请记住,这是一个标志,因此您将其添加到正则表达式的末尾,如 /hello/gmx
。此标志将忽略正则表达式中的空格。
例如,如果您编写像 /hello world/x
这样的表达式,它将匹配 helloworld
,但不匹配 hello world
。扩展标志还允许在您的正则表达式中添加注释。
例子
/helloworld #hello this is a comment/
如果需要使用空格,可以使用 \
来匹配空格。
\s
是一个字符类,因此可能需要也可能不需要包装在 []
或 ()
中,具体取决于语言/方言。
要精确匹配空格字符,您可以使用八进制值 \040
(Unicode characters displayed as octal) 或十六进制值 \x20
(Unicode characters displayed as hex)。
这是正则表达式语法参考:https://www.regular-expressions.info/nonprint.html。
在 Perl 中,开关是 \s
(空格)。
我正在使用正则表达式来确保我只允许字母、数字和空格
然后它就像在你已经拥有的东西上添加一个空间一样简单:
$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);
(注意,我删除了看似无意的 s|
?当然 s
是多余的;如果需要,您可以恢复 |
)
如果您特别想要 *a* 空间,例如只有一个空间,您将需要比这更复杂的表达式,并且可能需要考虑单独的非正则表达式逻辑。
在我看来,在这种情况下使用 REGEX 会有点矫枉过正。为什么不只是 strpos 来查找空格字符。此外,正则表达式中的空格字符并没有什么特别之处,您应该能够像搜索任何其他字符一样搜索它。也就是说,除非您禁用了模式空白,在这种情况下几乎没有必要这样做。
您也可以使用 \b 作为单词边界。对于名称,我会使用这样的名称:
[^\b]+\b[^\b]+(\b|$)
编辑将其修改为 Perl 示例中的正则表达式
if( $fullname =~ /([^\b]+)\b[^\b]+([^\b]+)(\b|$)/ ) {
$first_name = $1;
$last_name = $2;
}
再次编辑根据你想要的:
$new_tag = preg_replace("/[\s\t]/","",$tag);
\b
也匹配连字符
像这样使用它以允许一个空间。
$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
我正在尝试 [[:space:]] 在一个实例中,看起来 WordPress 中的博主正在使用非标准空格字符。看起来它会起作用。
A-Za-z...
中所有 not 的字符。方括号内的插入符号说明了这一点。将插入符号移出方括号会将其含义更改为匹配字符串开头的集合 in 中的字符。