2016-04-05 2 views
1

ПроблемаRegex отдельных портов через запятую

У меня есть рабочая шашка порта действия, однако мне нужно разделить порты запятой (без пробелов). Например, вместо того, чтобы использовать только «80», теперь будет «80, 443,8080».

Regex

(^(?:6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$ 

Пробовал

Я понимаю, что, возможно, придется разбить запрос, так что попробовал много вещей, включая добавление этого (, \ п |?, $) В конец запроса, однако это не сработало.

+0

Если регулярное выражение получило так много времени, возможно, было бы лучше реорганизовать его в другие операции с строкой и более четкие регулярные выражения. – alex

ответ

2

Поскольку PHP, с PCRE регулярное выражение вкуса, вы можете легко рекурсию подмаскам с подпрограммой:

^(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])(?:,(?1))*$ 

Смотрите regex demo

Объяснение:

  • ^ - начало строки
  • (6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9]) - Группа 1: проверка подшаблон один порт
  • (?:,(?1))* - 0+ последовательность , следует с подмаской выше (с (?1) подпрограмму, которая повторно использует шаблон внутри группа 1)
  • $ - конец строки
0

Другой способ, вы можете отрицать то, что вы ищете. Это означает:

  • 5 цифр номера верхней до 65535, или по крайней мере 6 цифр номера
  • смежными запятые или запятые в конце или начале строки
  • символов, которые не являются цифрой или запятой

чтобы использовать этот вид шаблона, вы, очевидно, необходимо, чтобы свести на нет preg_match функции:

return !preg_match('~6(?:5(?:5(?:3(?:[6-9]|\d{2})|[4-9]\d)|[6-9]\d{2})|[6-9]\d{3})|[7-9]\d{4}|[1-9]\d{5}|\B,|,\B|[^\d,]~S', $str); 

Модификатор S включает оптимизацию для не привязанных шаблонов.

Этот подход может быть интересным, так как поиск останавливается, как только шаблон преуспевает.