我想让这个正则表达式也支持空格,但是(不是在讨论\n
\r
)。
preg_match('/^[a-zA-Z0-9_-]+$/', $text);
当我尝试做的时候:
preg_match('/^[a-zA-Z0-9_- ]+$/', $text);
返回:编译失败:偏移量为13的字符类中的范围乱序
回顾一切,它应该只匹配a-z
& A-Z
& 0-9
& -
& _
& space
由于
答案 0 :(得分:4)
使用
preg_match('/^[a-zA-Z0-9_ -]+$/', $text);
否则([_- ]
)将被理解为范围
答案 1 :(得分:1)
这是因为你在空格之前有一个-
形成一个范围_-
,这是非法的,因为空间按字典顺序小于_
。要解决此问题,请在空格后移动-
,这样就不再与-
形成范围。
preg_match('/^[a-zA-Z0-9_ -]+$/', $text);
还可以考虑使用\s
来匹配任何空格字符,包括空格,制表符,换行符和cariage返回值。
preg_match('/^[a-zA-Z0-9_\s-]+$/', $text);
PS:很高兴你没有合法的范围,这将是一个令人讨厌的错误。 :)
答案 2 :(得分:1)
_-
中的[a-zA-Z0-9_- ]
被解释为从_
( LOW LINE ,0x5F)到
的字符范围( SPACE ,0x20)。但由于_
来自
后的,因此字符范围_-
无效。
由于您不想要该字符范围,您需要转义-
以使其不被解释为字符范围:
[a-zA-Z0-9_\- ]
或者重新排列角色,以便-
不会被解释为字符范围指示符,就像把它放在另一个字符范围之后或者在字符类的开头或结尾处:
[a-z-A-Z0-9_ ]
[a-zA-Z-0-9_ ]
[a-zA-Z0-9-_ ]
[-a-zA-Z0-9_ ]
[a-zA-Z0-9_ -]
答案 3 :(得分:0)
你需要逃避最后一个连字符:
preg_match('/^[a-zA-Z0-9_\- ]+$/', $text);
答案 4 :(得分:0)
将\ S用于空白
找到文档here
答案 5 :(得分:0)
我相信你的正则表达式字符串正在评估下划线短划线空间“_-”作为范围。尝试逃离破折号。