在正则表达式中重要的顺序?

时间:2015-03-20 05:32:06

标签: php regex

具体关于PHP preg_split,为什么这有效:

$words = preg_split("/[\/\s,_-]+/", $string);

以下返回" preg_split()[function.preg-split]:编译失败:偏移量为7"的字符类中的范围乱序:

$words = preg_split("/[\s,_-\/]+/", $string);

请注意唯一的区别是正则表达式在正则表达式中的位置。

1 个答案:

答案 0 :(得分:1)

$words = preg_split("/[\s,_-\/]+/", $string);的问题是-表示此处的范围无效

PHP Manual excerpt

  

减号(连字符)字符可用于指定范围   字符类中的字符。例如,[d-m]匹配任何字母   在d和m之间,包括在内。如果a中需要减号   类,它必须使用反斜杠转义或出现在某个位置   它不能被解释为指示范围,通常为   班上的第一个或最后一个角色。

如果范围有效,则不会出现编译错误,即从索引较低的字符到索引较高的字符开始。但是,此处,范围无效,因为_的十进制代码点为95,而/' s为47

尝试[\[\s,\/-_\]+][2],您会看到它捕捉到您不希望匹配的内容。

这就是为什么你应该在字符类中转义连字符,或者将它放在开头的末尾。这些是正确的正确的正则表达式:[\/\s,_-]+[-\/\s,_]+[\/\-\s,_]+