如何在 PHP 正则表达式中匹配空格字符?
我的意思是,像 "gavin schulz" 这样,两个单词之间的空格。我正在使用正则表达式来确保只允许字母、数字和一个空格。但我不确定如何找到这个空格。这是我目前的代码:
$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);
" "
(一个空格)。" *"
(即两个空格和一个星号)或 " +"
(一个空格和加号)。"[ X]"
,"[ X][ X]*"
或"[ X]+"
其中X
是物理制表符(在所有这些示例中,每个制表符前都有一个空格)。"+"
字符,呃)。"\s"
及其变体是最佳选择。此外,我认为词边界还可以匹配行的开头和结尾,在查找可能没有前导或后续空格的单词时很重要。$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
A-Za-z...
中的字符。 方括号内部的插入符号(^)就是这个意思。 将插入符号移到方括号外面会改变其含义,即匹配字符串开头处在集合中的字符。 - paxdiablo下面是有关正则表达式中空格的所有内容的小型速查表:
[[:blank:]]
只匹配空格或制表符,不包括换行符。与写作[ \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
是一个字符类,因此根据语言/方言的不同可能需要用[]
或()
进行包装。 - MarkHu要精确匹配空格字符,您可以使用八进制值\040
(Unicode 字符显示为八进制)或十六进制值\x20
(Unicode 字符显示为十六进制)。
以下是正则表达式语法参考:https://www.regular-expressions.info/nonprint.html。
\s
(空格)。$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);
s | ?肯定s是多余的;如果需要,可以恢复|)
如果您特别想要一个空格,例如仅仅是一个,那么您将需要比这更复杂的表达式,并且可能需要考虑单独的非正则表达式逻辑。
在这种情况下,使用正则表达式似乎有些杀鸡焉用牛刀。为什么不直接使用strpos来查找空格字符呢?另外,在正则表达式中,空格字符并没有什么特殊之处,你应该能够像查找其他任何字符一样查找它。也就是说,除非你禁用了模式空白,否则在这种情况下几乎没有必要这样做。
使用以下方式,以允许一个空格。
$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
[^\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
也会匹配连字符。 - Toby 1 Kenobi这可以更好地匹配轮胎,因为并非所有供应商都使用相同的尺寸格式。我与许多供应商打交道,他们都使用不同的尺寸格式。目前这是我的表述。
/^[\d][\d](?:\d)?(?:\-|\/|\s)?([?:\d]+)?(?:\.)?(?:\d)?(?:\d)?(?:R|-|\s)?[1-3]([?:[\d]+)?(?:\.)?([?:\d])?(?:\s|-)/img
将捕获所有
35-12.50-22 HAIDA [AA]
35-12-22 HAIDA [AA]
35/35R20
35/35r20
这是一个测试
rrrrr
awdg
3345588
225-45-17 ACCELERA [AC]
195 50 16 KELLY
1955016 KELLY
CP671"
158 Buckshot
165-40-16-ACHILLES
11-24.5-16-LEAO-LLA08
11-24.5-LEAO-D37
11-22.5-14-LINGLONG-LLD37
11-22.5-HAPPYROAD [AA]