Задать вопрос
@iEvgesha

Почему некорректно работает регулярное выражение в PHP?

Писал регулярку, для проверки доменного имени в рамках обучения:

$reg = "#^(([a-zA-Z0-9]+-?)*[a-zA-Z0-9]\.)*[a-zA-Z0-9]{2,}$#";
            preg_match($reg, $domain, $res);

Опустим неточности проверки соответствия именно Доменному имени (это можно доработать).
Меня больше всего заинтересовал следующий вопрос:
Она прекрасно работает до момента, пока в домене верхнего уровня до 18ти символов, а 19+ выдают "false" почему так?

Все остальное ошибок не вызывает: поддомены в количествах до 20-30шт (больше не проверял), разной длины (до 40-50 символов), отсутствие поддоменов, пустые имена доменов, как и положено ошибку выдают и пр. Ну из логики регулярки мне это понятно.

Но как только добавляю 19ый+ символ в название домена верхнего уровня - сразу получается False.
Примеры:

1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.1.rusreasreasreasreasssreasreasreasreasss.reasreasreasreasss - true
rusreasreasreasreasssreasreasreasreasss.reasreasreasreasss - true
reasreasreasreasss - true
reasreasreasreassss - false
  • Вопрос задан
  • 118 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Если preg_match возвращает false (не 0, а именно false), то в процессе разбора строки произошла ошибка. В вашем случае это Catastrophic backtracking.
Вот работающий эквивалент вашего регулярного выражения:
^(?:[a-z0-9]+(?:-[a-z0-9]+)*\.)*[a-z0-9]{2,}$i
Ответ написан
Комментировать
@dodo512
([a-zA-Z0-9]+-?)*
Тут достаточно убрать +
([a-zA-Z0-9]-?)*
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
The solution is simple. When nesting repetition operators, make absolutely sure that there is only one way to match the same match.

https://www.regular-expressions.info/catastrophic.html
А отлаживать регулярки удобно на https://regex101.com/
Там можно не только увидеть готовый результат, но и посмотреть, как именно работает логика регулрного выражения применительно к конкретной строке.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы