我想验证0-255范围内的数字
我有这个表达
'/^([0-1]?[0-9]?[0-9])|([2][0-4][0-9])|(25[0-5])$/'
但这接受任何数字...... 这有效:
'/(^[0-1]?[0-9]?[0-9]$)|(^[2][0-4][0-9]$)|(^25[0-5]$)/'
为什么每个选项都必须有^和$?
编辑:我有,但我无法回答我的问题,因此 - ^
和$
的优先级高于|
,因此/^(...)$/
帮助了
答案 0 :(得分:8)
注意: @alex's answer是要走的路。使用正则表达式验证数字范围就像使用手提钻来捕捉苍蝇一样。
但是我想为这个“问题”提供一个解释。
你不必,你只需要正确分组,这意味着你必须对交替进行分组:
'/^(([0-1]?[0-9]?[0-9])|([2][0-4][0-9])|(25[0-5]))$/'
// ^ ^
否则表达式将被解释如下(逻辑上)
(^number) OR (number) OR (number$)
使用括号,它将是
^(number OR number OR number)$
答案 1 :(得分:7)
请勿使用正则表达式来验证数字范围。
只是使用条件......
if ($number >= 0 AND $number <= 255) {
...
}
这将确保数字介于0到255之间,这正是你的正则表达式所做的。
要具体回答你的问题,它不起作用,因为你需要用捕获组包装整个东西,否则正则表达式引擎会对每个正则表达式执行 OR ...
/^([0-1]?[0-9]?[0-9]|[2][0-4][0-9]|25[0-5])$/
另请注意,$
会在任何尾随\n
之前匹配。如果你真的想在字符串的末尾匹配,请使用\z
。
答案 2 :(得分:3)
另一种方法(但我认为先前的解决方案更好)
in_array($number, range(0, 255))
答案 3 :(得分:2)
我进一步玩了,这里是严格的0-255范围的正则表达式,没有允许的前导零:
'/^([0]|[1-9]\d?|[1]\d{2}|2([0-4]\d|5[0-5]))$/'
答案 4 :(得分:1)
首先,我同意@Alex的回答是可行的方式;但是,值得一提的是,正则表达式版本可以用更简洁的模式完成:
/^([01]?\d{1,2}|2([0-4]\d|5[0-5]))$/
...这是我在数字解析不是一个选项时使用的。
答案 5 :(得分:0)
[0-9] | [1-9] [0-9] | 1 [0-9] [0-9] | 2 [0-4] [0-9] | 25 [0-5]
将起作用
答案 6 :(得分:0)
^(([0-9]|[1-9][0-9])|[1][0-9][0-9]|[2][0-5][0-5])$
这适用于0-255,意味着没有前导零,例如001
答案 7 :(得分:0)
我知道这已经得到了解答,但我需要一个类似的页面路由正则表达式;除了1-66的范围。这很好用:/ ^(?!67 | 68 | 69)[1-6] [0-9] | [1-9] $ /