改进此正则表达式以支持空间

时间:2010-12-05 19:02:23

标签: php regex

我想让这个正则表达式也支持空格,但是(不是在讨论\n \r)。

preg_match('/^[a-zA-Z0-9_-]+$/', $text);

当我尝试做的时候:

preg_match('/^[a-zA-Z0-9_- ]+$/', $text);

返回:编译失败:偏移量为13的字符类中的范围乱序

回顾一切,它应该只匹配a-z& A-Z& 0-9& -& _& space

由于

6 个答案:

答案 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)

我相信你的正则表达式字符串正在评估下划线短划线空间“_-”作为范围。尝试逃离破折号。