Назад | Перейти на главную страницу

Шаблон URL соответствия RegEx

Я пытаюсь придумать шаблон регулярного выражения, который будет соответствовать любым доменам в этом формате:

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 или всей строки запроса для проверки действительности.