2010-12-05 36 views
0

我想使这个正则表达式也支持空格,但是(不是在谈论\n\r)。改进此正则表达式来支持空格

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

当我尝试这样做:

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

它返回:编译失败:范围出的顺序字符类偏移量13

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

感谢

回答

4

使用

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

否则([_- ])将被理解为范围

0

你需要躲避最后连字符:

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

使用\ S为空白

文档中发现here

+0

这应该如何提供帮助? – 2010-12-05 23:26:15

0

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

1

这是因为你有一个-之前的空间形成范围_-,这是非法的,因为空间按字典顺序小于_。要解决此问题,请在空格后移动-,以便您不再构成范围从-

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

还要考虑使用\s匹配任何空白字符,包括空格,制表符,换行符和cariage回报。 PS:很高兴你没有合法范围,这可能是一个令人讨厌的错误。 :)

+2

+1按字典顺序排列 – Ryan 2010-12-05 19:08:12

1

[a-zA-Z0-9_- ]_- 被解释为字符范围从_低线,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_ -] 
+0

尽管您的所有解决方案都是正确的,但我认为仅仅因为可以给予人们很多选择是明智的。此外,如果在范围*成语旁边的*文字连字符是不太可读的IMO,并且不能保证适用于所有正则表达式。只是我的2分。 – 2010-12-05 23:42:16