Iva*_*ana 4 php regex validation pcre
我想验证0-255范围内的数字
我有这个表达
'/^([0-1]?[0-9]?[0-9])|([2][0-4][0-9])|(25[0-5])$/'
Run Code Online (Sandbox Code Playgroud)
但这接受任何数字......这有效:
'/(^[0-1]?[0-9]?[0-9]$)|(^[2][0-4][0-9]$)|(^25[0-5]$)/'
Run Code Online (Sandbox Code Playgroud)
为什么我必须为每个选项都有^和$?
编辑:我有,但我无法回答我的问题,所以 - ^并且$优先级高于|,所以/^(...)$/帮助
注意: @ alex的答案是要走的路.使用正则表达式验证数字范围就像使用手提钻来捕捉苍蝇一样.
但是,我想为这个"问题"提供一个解释.
你不必,你只需要正确分组,这意味着你必须对交替进行分组:
'/^(([0-1]?[0-9]?[0-9])|([2][0-4][0-9])|(25[0-5]))$/'
// ^ ^
Run Code Online (Sandbox Code Playgroud)
否则表达式将被解释如下(逻辑上)
(^number) OR (number) OR (number$)
Run Code Online (Sandbox Code Playgroud)
使用括号,它将是
^(number OR number OR number)$
Run Code Online (Sandbox Code Playgroud)
不要使用正则表达式来验证数字范围.
只是使用一个条件......
if ($number >= 0 AND $number <= 255) {
...
}
Run Code Online (Sandbox Code Playgroud)
这将确保数字介于0到255之间,这正是你的正则表达式所做的.
要具体回答你的问题,它不起作用,因为你需要用捕获组包装整个东西,否则正则表达式引擎将对每个单独的正则表达式执行OR ...
/^([0-1]?[0-9]?[0-9]|[2][0-4][0-9]|25[0-5])$/
Run Code Online (Sandbox Code Playgroud)
另请注意,$在任何尾随之前匹配\n.\z如果你真的想在字符串的末尾匹配,请使用.