#regex
#регулярное выражение
Вопрос:
Я пытаюсь найти домен — все, кроме поддомена.
У меня есть это регулярное выражение прямо сейчас:
(?:[-a-zA-Z0-9] .)*([-a-zA-Z0-9] (?:.[a-zA-Z]{2,3})){1,2}
Это работает для таких вещей, как:
domain.tld
subdomain.tld
Но это приводит к проблемам с такими дву, как «.com.au » или «.co.uk «:
domain.co.uk (finds co.uk, should find domain.co.uk)
subdomain.domain.co.uk (finds co.uk, should find domain.co.uk)
Есть какие-нибудь идеи?
Комментарии:
1. text1.text2.text3 может быть subdomain.domain.suffix или это может быть domain.suffixPart1.suffixPart2. Одно только регулярное выражение не является ответом.
2. @Mitch — я не перечислил это, потому что не думал, что это актуально, поскольку я могу заставить это работать. Я использую PHP, но могу перенести regex с любого языка, чтобы заставить его работать.
Ответ №1:
Я не уверен, что эта проблема «разумно разрешима»; Mozilla поддерживает список доменов с «общедоступным суффиксом», который предназначен для того, чтобы помочь авторам браузеров принимать файлы cookie только для доменов в пределах одного административного элемента управления (например, запретить кому-либо устанавливать cookie, действительный для *.co.uk.
или *.union.aero.
). Очевидно, что он не идеален (ближе к концу вы найдете длинный список is-a-caterer.com
доменов в стиле, поэтому foo.is-a-caterer.com
не удалось установить файл cookie, который будет использоваться bar.is-a-caterer.com
, но is-a-caterer.com
он вполне является «доменом», как вы его определили.)
Итак, если вы готовы использовать предоставленный список, вы могли бы написать быстрый небольшой синтаксический анализатор, который знал бы, как применять общие правила и исключения, чтобы определить, где в данной входной строке находится ваш «домен», и возвращать только ту часть, которая вас интересует.
Я думаю, что более простые подходы обречены на провал: некоторые ccTLD, например, .ca
не используют домены второго уровня, некоторые, например, .br
используют десятки, а некоторые, например lib.or.us
, находятся на расстоянии нескольких уровней от «домена», например multnomah.lib.or.us
. Если вы не используете кураторские списки, домены которых являются общедоступным суффиксом, вы обречены на ошибку в отношении какого-то нетривиального набора входных строк.
Комментарии:
1. Спасибо за ответ! Я либо попытаюсь найти тот, который уже существует, либо сделаю свой собственный 🙂