Какое регулярное выражение я могу использовать для проверки числа от 0 до 255? - PullRequest
4 голосов
/ 03 июля 2011

Я хочу проверить число в диапазоне 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]$)/'

почему я должен иметь ^ и $ для каждой опции?

edit: у меня есть, но я не могу ответить на мой вопрос, поэтому - ^ и $ имеют более высокий приоритет, чем |, поэтому /^(...)$/ помог

Ответы [ 8 ]

8 голосов
/ 03 июля 2011

Примечание: @ alex's ответ - это путь. Проверка диапазона чисел с помощью регулярных выражений подобна использованию отбойного молотка для ловли мухи.

Но тем не менее я хотел дать объяснение этой "проблемы".


Вам не нужно, вы просто должны сгруппировать его правильно, что означает, что вы должны сгруппировать чередование:

'/^(([0-1]?[0-9]?[0-9])|([2][0-4][0-9])|(25[0-5]))$/'
// ^                                             ^

В противном случае выражение будет интерпретировано следующим образом (логически)

(^number) OR (number) OR (number$)

С скобками это будет

^(number OR number OR number)$
7 голосов
/ 03 июля 2011

Не используйте регулярные выражения для проверки диапазона номеров.

Просто используйте условие ...

if ($number >= 0 AND $number <= 255) {
   ...
}

Это будет гарантировать, что число находится в диапазоне от 0 до 255 включительно, что, по-видимому, и делает ваше регулярное выражение.

Чтобы конкретно ответить на ваш вопрос, он не работает, потому что вам нужно обернуть все это группой захвата, в противном случае механизм регулярных выражений выполнит ИЛИ каждого отдельного регулярного выражения ...

/^([0-1]?[0-9]?[0-9]|[2][0-4][0-9]|25[0-5])$/

Также обратите внимание, что $ будет соответствовать перед любым трейлингом \n. Используйте \z, если вы действительно хотите найти соответствие в конце строки.

3 голосов
/ 03 июля 2011

еще один метод (но я думаю, что предыдущее решение лучше)

in_array($number, range(0, 255))
2 голосов
/ 04 июля 2011

Я играл с ним дальше, и вот регулярное выражение для строгого диапазона 0-255, без начальных нулей разрешено:

'/^([0]|[1-9]\d?|[1]\d{2}|2([0-4]\d|5[0-5]))$/'

1 голос
/ 03 июля 2011

Во-первых, я согласен, что ответ @ Алекса - это путь, если таковой имеется;однако, возможно, стоит упомянуть, что версия регулярного выражения может быть сделана с несколько более лаконичным шаблоном:

/^([01]?\d{1,2}|2([0-4]\d|5[0-5]))$/

..., который я использую, когда числовой анализ не подходит.

0 голосов
/ 06 февраля 2015

Я знаю, что на это ответили, но мне нужно было подобное регулярное выражение для маршрутизации страниц; кроме диапазона 1-66. Это хорошо сработало: / ^ (?! 67 | 68 | 69) [1-6] [0-9] | [1-9] $ /

0 голосов
/ 13 января 2014

^(([0-9]|[1-9][0-9])|[1][0-9][0-9]|[2][0-5][0-5])$ это работает для 0-255, что означает отсутствие ведущих нулей, таких как 001

0 голосов
/ 13 сентября 2013

[0-9] | [1-9] [0-9] | 1 [0-9] [0-9] | 2 [0-4] [0-9] | 25 [0-5]

будет работать

...