Я хочу проверить число в диапазоне 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]$)/'
почему я должен иметь ^ и $ для каждого варианта?
У меня есть это, но я не могу ответить на мой вопрос, поэтому – ^
и $
имеют более высокий приоритет, чем |
, так что /^(...)$/
помогло
Примечание: ответ @ alex – это путь. Проверка диапазона чисел с регулярным выражением похожа на использование отбойного молотка, чтобы поймать муху.
Но тем не менее я хотел дать объяснение этой «проблеме».
Вам не обязательно это делать, вам просто нужно сгруппировать его правильно, что означает, что вам нужно сгруппировать чередование:
'/^(([0-1]?[0-9]?[0-9])|([2][0-4][0-9])|(25[0-5]))$/' // ^ ^
В противном случае выражение будет интерпретироваться следующим образом (логически)
(^number) OR (number) OR (number$)
В скобках это будет
^(number OR number OR number)$
Не используйте регулярное выражение для проверки диапазона чисел.
Просто используйте условие …
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
если вы действительно хотите совместить в конце строки.
еще один метод (но предыдущее решение лучше, я думаю)
in_array($number, range(0, 255))
Я играл с ним дальше, и вот регулярное выражение для строгого диапазона 0-255, без допустимых нулей:
'/^([0]|[1-9]\d?|[1]\d{2}|2([0-4]\d|5[0-5]))$/'
Во-первых, я согласен, что ответ @ Alex – это путь, если он доступен; однако, может быть, стоит упомянуть, что версия регулярного выражения может быть выполнена с несколько более кратким шаблоном:
/^([01]?\d{1,2}|2([0-4]\d|5[0-5]))$/
… это то, что я использую, когда числовой синтаксический анализ не является вариантом.
[0-9] | [1-9] [0-9] | 1 [0-9] [0-9] | 2 [0-4] [0-9] | 25 [0-5]
будет работать
^(([0-9]|[1-9][0-9])|[1][0-9][0-9]|[2][0-5][0-5])$
это работает для 0-255, что означает отсутствие начальных нулей, таких как 001
Я знаю, что на это был дан ответ, но мне понадобилось подобное регулярное выражение для маршрутизации страницы; за исключением диапазона 1-66. Это хорошо работает: / ^ (?! 67 | 68 | 69) [1-6] [0-9] | [1-9] $ /