Как проверить доменное имя с помощью Regex & Php?

Я хочу, чтобы решение для проверки только доменных имен не было полным 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 

спасибо

Related of "Как проверить доменное имя с помощью Regex & Php?"

Как насчет:

 ^(?:[-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}$ 

Этот шаблон соответствует большинству * правил, определенных в спецификациях:

  • Каждая метка / уровень (разделенная точкой) может содержать до 63 символов .
  • Полное доменное имя может иметь до 127 уровней .
  • Полное доменное имя не может превышать 253 символа в его текстовом представлении.
  • Каждая метка может состоять из букв, цифр и дефис .
  • Ярлыки не могут начинаться или заканчиваться дефисом.
  • Домен верхнего уровня (расширение) не может быть всезначным .

Примечание 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 …

  • В конце концов, это всего лишь проверка формата. Тест регулярного выражения не подтверждает, что доменное имя действительно настроено / существует! Вы должны проверить существование, сделав запрос.

Спецификации и ссылки:

  • IETF: RFC1035
  • IETF: RFC1123
  • IETF: RFC2181
  • IETF: RFC952
  • Википедия: Система доменных имен

Попробуйте следующее выражение:

 ^(http[s]?\:\/\/)?((\w+)\.)?(([\w-]+)?)(\.[\w-]+){1,2}$ 

Что это на самом деле

  • необязательный http / s: //
  • необязательный www
  • любое действующее буквенно-цифровое имя (включая – и _)
  • 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)

Надеюсь, я все рассмотрел, если что-то пропустил, скажите, пожалуйста, и я могу улучшить эту функцию. 🙂