Пытаюсь написать регексп для строгой валидации домена с поддержкой IDN кодировки (xn--).
На данный момент «как надо» у меня работает только проверка TLD:
[a-z]{2,6}$|(xn--)?[a-z0-9]{4,32}
т.е проверка на обычные a-z, затем на punycode (перечисление всех зарегистрированных зон пока-что опустил для упрощения)
А вот с левой частью проблемы…
Вопрос: как проверить маску, в которой некоторые символы могут быть только внутри и не рядом (дефис и точка),
но при том с поддержкой xn-- вначале или перед точкой. и чтобы каждый блок разделённый точками не превышал нужный размер…
например, должно быть false:
-aaaa
aaaa-
aa--a
--aaa
aaa--
.aaaa
aaaa.
..aaa
aa..a
должно быть true:
xn--aaaaaa
xn--a-aa.a
a-a.xn--aa
a.xn--aa.a
xn--a-aa-a
Обгуглил весь интернет, из мануалов всё очевидно, но пытаюсь встроить в общую картину, и ничего в итоге не работает.
А готовые примеры в основном «детские», мне такие не подходят. Очень важно как можно точнее определить правильность для избежания запросов DNS, куда после валидации регекспом попадает домен.
Пока остановился на обычной проверке вхождений символов, без учёта повторов и правильной длины каждого блока.
Вот мой скрипт со списком проверочных доменов (75 штук «should be false» и 10 «should be true»):
pastebin.com/7GaMDZhQ