Я пытаюсь придумать шаблон регулярного выражения, который будет соответствовать любым доменам в этом формате:
example.com
но не это:
subdomain.example.com
В настоящее время он должен охватывать только основные TLD (com, net, org), но я бы хотел, чтобы он мог обрабатывать другие (например, co.uk, com.br и т. Д.) Для гибкости.
Пока что у меня есть это, но определенно нужно немного поработать:
^[^w].*\.[a-z]{3}.*$
Может ли мне помочь ниндзя с регулярными выражениями?
РЕДАКТИРОВАТЬ: регулярное выражение будет использоваться в PHP, и никогда не будет протокола в начале строки для сопоставления из-за настройки скрипта. Мне пришлось бы углубиться в сценарий, чтобы получить более подробную информацию о том, почему это правда, но я считаю, что это просто захват имени хоста из переменной PHP $ _SERVER.
РЕДАКТИРОВАТЬ 2: Возможно, это сработает, чтобы охватить что угодно, кроме периода до чего-то соответствующего .xyz или .xyz.ab или .xyz.abc ^[^.]+(\.[^.]{3}|\.[^.]{2,3}\.[^.]{2,3}).*$
РЕДАКТИРОВАТЬ 3: У меня есть почти завершенный шаблон: updated below
(php требует / и / в начале и в конце) Может кто дырявит в реализации? Похоже, он работает, как ожидалось.
РЕДАКТИРОВАТЬ 4: Вот где я сейчас нахожусь: updated below
Он почти соответствует тому, что я хочу, хотя для этого требуется / в начале пути к файлу, поэтому example.com не соответствует, а example.com/test соответствует. Я не могу заставить его соответствовать example.com без совпадения ".exa" в "www.example.com".
РЕДАКТИРОВАТЬ 5: Хорошо, у нас есть победитель: /^[^.]+((\.[^.\/]{1,3}\b){1,2}).*$/
Спички:
example.com
example.co.uk
example.com/test.php?a=b
example.co.uk/test.php?a=b
123.com
1234.com
www.123.com (соответствует всем URL-адресам с доменами короче 4 символов)
Не совпадает:
www.example.com
www.example.co.uk
www.example.com/test.php?a=b
www.example.co.uk/test.php?a=b
test.example.com/test.php?a=b
test.example.co.uk/test.php?a=b
www.1234.com
На каком языке ты говоришь?
В общем, похоже, что вам нужно что-то, что соответствует основным аспектам домена, исключая возможность периода, отличного от того, который выделяет .tld.
#http: // [^.] + \. (com | net | org) #i
Если вы не хотите сопоставлять протокол, возможно, что-то вроде этого.
# [^. ] + \. (com | net | org) #i
Ваше желание управлять многосоставными TLD действительно испортит ситуацию, вам нужно будет вести ручной список всех тех, которые вы хотите сопоставить. Единственная альтернатива - выполнить поиск в DNS для определения типа листинга. На самом деле нет другого способа извлечь данные поддомена из домена с помощью регулярного выражения, потому что по правам домены на самом деле являются просто поддоменами некоторого TLD (домена верхнего уровня).
Редактировать: Чтобы соответствовать TLD, предполагая, что они будут иметь менее четырех символов, вы можете поиграть с чем-то вроде этого. Вам нужно будет определить, что является началом и концом матча. Вам требуется наличие протокола? Это в абзаце, где кто-то может напечатать точку вне контекста? Если вы предоставите более подробную информацию о параметрах, мы сможем предоставить более точное решение.
[^.]+((\.[^.]{0,3})+)
Одним из лучших ресурсов в сети для этого является regexlib:
http://regexlib.com/Search.aspx?k=URL
http://regexlib.com/Search.aspx?k=TLD
Существует множество примеров соответствия протокола и TLD или всей строки запроса для проверки действительности.