Я хочу, чтобы решение для проверки только доменных имен не было полным URL-адресом. Следующий пример – это то, что я ищу:
domain.com -> true domain.net -> true domain.org -> true domain.biz -> true domain.co.uk -> true sub.domain.com -> true domain.com/folder -> false domµ*$ain.com -> false
спасибо
Как насчет:
^(?:[-A-Za-z0-9]+\.)+[A-Za-z]{2,6}$
Выбранный ответ является неполным / неправильным.
Образец регулярного выражения;
НЕ ДОЛЖНЫ проверять домены, такие как:
-domain.com
, domain--.com
, -domain-.-.com
, domain.000
и т. д. …
должен проверять домены, такие как:
schools.k12
, newTLD.clothing
, good.photography
и т. д.
После дальнейших исследований; ниже – самый правильный, кросс-язычный и компактный образец, который я мог бы придумать:
^(?!\-)(?:[a-zA-Z\d\-]{0,62}[a-zA-Z\d]\.){1,126}(?!\d+)[a-zA-Z\d]{1,63}$
Этот шаблон соответствует большинству * правил, определенных в спецификациях:
Примечание 1 : Полная проверка длины домена не включена в регулярное выражение. Он должен быть просто проверен нативными методами, например strlen(domain) <= 253
.
Примечание 2 : Этот шаблон работает с большинством языков, включая PHP, Javascript, Python и т. Д.
См. Здесь DEMO (для JS, PHP, Python)
Регулярное выражение выше не поддерживает IDN .
Нет спецификации, указывающей, что расширение (TLD) должно быть от 2 до 6 символов. Он фактически поддерживает 63 символа. См. Текущий список TLD здесь . Кроме того, некоторые сети внутренне используют пользовательские / псевдо-TLD.
Органы регистрации могут налагать дополнительные, определенные правила, которые явно не поддерживаются в этом регулярном выражении. Например, .CO.UK
и .ORG.UK
должны иметь как минимум 3 символа, но менее 23, не включая расширение. Эти правила нестандартны и могут быть изменены. Не выполняйте их, если вы не можете поддерживать.
Регулярные выражения – отличное, но не лучшее эффективное, эффективное решение каждой проблемы. Поэтому вместо этого следует использовать собственный парсер URL. например, urlparse()
Python или метод urlparse()
PHP …
В конце концов, это всего лишь проверка формата. Тест регулярного выражения не подтверждает, что доменное имя действительно настроено / существует! Вы должны проверить существование, сделав запрос.
Попробуйте следующее выражение:
^(http[s]?\:\/\/)?((\w+)\.)?(([\w-]+)?)(\.[\w-]+){1,2}$
В моем случае доменное имя считается действительным, если формат – stackoverflow.com или xxx.stackoverflow.com
Поэтому, помимо других ответов на стек, я добавил проверку на www. также.
function isValidDomainName($domain) { if (filter_var(gethostbyname($domain), FILTER_VALIDATE_IP)) { return (preg_match('/^www./', $domain)) ? FALSE : TRUE; } return FALSE; }
вы можете проверить функцию с помощью этого кода
$domain = array("http://www.domain.com","http://www.domain.com/folder" ,"http://domain.com", "www.domain.com", "domain.com/subfolder", "domain.com","sub.domain.com"); foreach ($domain as $v) { echo isValidDomainName($v) ? "{$v} is valid<br>" : "{$v} is invalid<br>"; }
Помните, что регулярные выражения могут проверять только, правильно ли сформировано что-то. «www.idonotexistbecauseiammadeuponthespot.com» хорошо сформирован, но на самом деле не существует … на момент написания. 😉 Кроме того, некоторые бесплатные хостинг-провайдеры (например, Tripod) позволяют подчеркивать в субдоменах. Это явно является нарушением RFC, но иногда это работает.
Вы хотите проверить, существует ли домен? Попробуйте dns_get_record вместо (просто) регулярного выражения.
Я сделал функцию для проверки имени домена без какого-либо регулярного выражения.
<?php function validDomain($domain) { $domain = rtrim($domain, '.'); if (!mb_stripos($domain, '.')) { return false; } $domain = explode('.', $domain); $allowedChars = array('-'); $extenion = array_pop($domain); foreach ($domain as $value) { $fc = mb_substr($value, 0, 1); $lc = mb_substr($value, -1); if ( hash_equals($value, '') || in_array($fc, $allowedChars) || in_array($lc, $allowedChars) ) { return false; } if (!ctype_alnum(str_replace($allowedChars, '', $value))) { return false; } } if ( !ctype_alnum(str_replace($allowedChars, '', $extenion)) || hash_equals($extenion, '') ) { return false; } return true; } $testCases = array( 'a', '0', 'a.b', 'google.com', 'news.google.co.uk', 'xn--fsqu00a.xn--0zwm56d', 'google.com ', 'google.com.', 'goo gle.com', 'a.', 'hey.hey', 'google-.com', '-nj--9*.vom', ' ', '..', 'google..com', 'www.google.com', 'www.google.com/some/path/to/dir/' ); foreach ($testCases as $testCase) { var_dump($testCase); var_dump(validDomain($TestCase)); echo '<br /><br />'; } ?>
Этот код выводит:
string (1) "a" bool (false)
string (1) "0" bool (false)
string (3) "ab" bool (true)
string (10) "google.com" bool (true)
string (17) "news.google.co.uk" bool (true)
строка (23) "xn – fsqu00a.xn – 0zwm56d" bool (true)
string (11) "google.com" bool (false)
string (11) "google.com." BOOL (истина)
string (11) "goo gle.com" bool (false)
string (2) "a." BOOL (ложь)
string (7) "hey.hey" bool (true)
string (11) "google-.com" bool (false)
string (11) "-nj – 9 * .vom" bool (false)
string (1) "" bool (false)
string (2) ".." bool (false)
string (11) "google..com" bool (false)
string (14) "www.google.com" bool (true)
строка (32) "www.google.com/some/path/to/dir/" bool (false)
Надеюсь, я все рассмотрел, если что-то пропустил, скажите, пожалуйста, и я могу улучшить эту функцию. 🙂