Intereting Posts
Как перенаправить URL-адрес после определения некоторых переменных с помощью curl_init Как устранить неполадку пакета при попытке заставить композитора получить последние версии пакетов? Получение одной строки только с MySQLi установите флажки рядом с элементами таблицы html php Как подключиться к серверу socket.io с другого хоста? «Отображение результатов X-Y из Z» с использованием библиотеки разбиения на страницы Codeigniter? Как выполнить цикл в наборе результатов mysql в режиме без жира? инструменты отчетности php Готовые заявления PHP \ MYSQL кратчайшее значение хэша Форма в модальном режиме должна отображать результат в том же модальном Twitter загрузочный лоток распространяется на динамические веб-сайты Создание ISODate для MongoDB с помощью PHP Является ли это правильной моделью фабричного метода? Как регистрировать действия пользователя с php и mysql?

Какое регулярное выражение можно использовать для проверки числа от 0 до 255?

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