Preg_match会从某些数字中删除最后一个零

时间:2013-08-28 19:53:48

标签: php regex preg-match

我认为只有在我写一个正则表达式时才会发生这种情况。我有一个简单的正则表达式来验证一组分页号,稍后将提交到数据库,如5102550,{{1} },100示例:

250

当我执行测试时,上面的正则表达式只会从数字 50,100 250 中删除/all|5|10|25|50|100|250/ ,而不是来自0! ?

在线示例:
http://viper-7.com/IbKFKw

我在这里做错了什么?这次我真的错过了什么?

2 个答案:

答案 0 :(得分:10)

这是因为在字符串50中,正则表达式首先匹配5,这是有效的。在字符串250中,正则表达式首先匹配25,该值有效并在此处结束。

您可以尝试添加锚点:

/^(?:all|5|10|25|50|100|250)$/

这会强制正则表达式匹配整个字符串,因此返回正在寻找的正确匹配。

答案 1 :(得分:7)

从左到右尝试替代方案,因此匹配5优先于50。但是没有10切断10。你可以简单地重新排序它们:

/all|250|100|50|25|10|5/

或者,将0可选地添加到相关的替代方案中(由于?贪婪,0将匹配(如果存在)):

/all|50?|100?|250?/

/all|(?:5|10|25)0?/

如果这不是用于匹配而是用于验证(即检查整个字符串),那么请使用Jerry的建议并使用锚来确保您的号码周围没有不需要的字符:

/^(?:all|5|10|25|50|100|250)$/

(当然在(?:...)里面你也可以使用我上面的任何模式,但现在优先级是无关紧要的,因为不允许不完整的匹配。)