Согласно RFC3270 (и в свою очередь RFC1035),
/
(?(DEFINE)
(?<IQN_PAT>
iqn
\.
[0-9]{4}-[0-9]{2}
\.
(?&REV_SUBDOMAIN_PAT)
(?: : .* )?
)
(?<EUI_PAT>
eui
\.
[0-9A-Fa-f]{16}
)
(?<REV_SUBDOMAIN_PAT>
(?&LABEL_PAT) (?: \. (?&LABEL_PAT) )*
)
(?<LABEL_PAT>
[A-Za-z] (?: [A-Za-z0-9\-]* [A-Za-z0-9] )?
)
)
^ (?: (?&IQN_PAT) | (?&EUI_PAT) ) \z
/sx
Непонятно, принимают ли имена eui строчные шестнадцатеричные цифры или нет. Я подумал, что было бы безопаснее позволить им.
Если вы сократите вышеупомянутое, вы получите /^(?:iqn\.[0-9]{4}-[0-9]{2}(?:\.[A-Za-z](?:[A-Za-z0-9\-]*[A-Za-z0-9])?)+(?::.*)?|eui\.[0-9A-Fa-f]{16})\z/s
.
(Кстати, вы используете /m
неправильно, ваше использование /i
неправильно, и \d
может соответствовать гораздо большему, чем допустимое [0-9]
.)