I want to validate number in range of 0-255
I have this expression
'/^([0-1]?[0-9]?[0-9])|([2][0-4][0-9])|(25[0-5])$/'
But this accepts any number... And this works:
'/(^[0-1]?[0-9]?[0-9]$)|(^[2][0-4][0-9]$)|(^25[0-5]$)/'
why do I have to have ^ and $ for each option?
edit: I have it, but I cannot answer my question, so - ^ and $ have higher priority than |, so /^(...)$/ helped
Note: @alex's answer is the way to go. Validating a number range with regex is like using a jackhammer to catch a fly.
But nevertheless I wanted to provide an explanation for this "problem".
You don't have to, you just have to group it correctly, which means you have to group the alternation:
'/^(([0-1]?[0-9]?[0-9])|([2][0-4][0-9])|(25[0-5]))$/'
// ^ ^
Otherwise the expression will be interpreted as follows (logically)
(^number) OR (number) OR (number$)
With the brackets, it will be
^(number OR number OR number)$
Don't use a regex for validating a number range.
Just use a condition...
if ($number >= 0 AND $number <= 255) {
...
}
This will ensure the number is between 0 and 255 inclusively, which is what your regex appears to be doing.
To answer your question specifically, it doesn't work because you need to wrap the whole thing with a capturing group otherwise the regex engine will do an OR of each individual regex...
/^([0-1]?[0-9]?[0-9]|[2][0-4][0-9]|25[0-5])$/
Also note that $ will match before any trailing \n. Use \z if you really want to match at the end of the string.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With