Как проверить доменное имя с помощью Regex & Php? - PullRequest
18 голосов
/ 12 июня 2010

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

Спасибо

Ответы [ 6 ]

73 голосов
/ 11 мая 2013

Выбранный ответ является неполным / неправильным.

Шаблон регулярного выражения;

  • НЕ ДОЛЖНО проверять домены, такие как:
    -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 s.

  • Нет спецификаций, в которых говорится, что расширение (TLD) должно содержать от 2 до 6 символов.На самом деле он поддерживает 63 символа.См. Текущий список TLD здесь .Кроме того, некоторые сети действительно используют собственные / псевдо TLD.

  • Органы регистрации могут наложить некоторые дополнительные специальные правила , которые явно не поддерживаются в этом регулярном выражении.Например, .CO.UK и .ORG.UK должны содержать не менее 3 символов, но не более 23, не включая расширение.Эти виды правил являются нестандартными и могут быть изменены.Не применяйте их, если не можете поддерживать.

  • Регулярные выражения - это здорово, но не самое эффективное, эффективное решение для любой проблемы.Поэтому вместо этого следует использовать собственный анализатор URL-адресов.например, метод Python urlparse() или PHP parse_url() метод ...

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

Характеристики и ссылки:

22 голосов
/ 12 июня 2010

Как насчет:

^(?:[-A-Za-z0-9]+\.)+[A-Za-z]{2,6}$
1 голос
/ 30 марта 2016

Пожалуйста, попробуйте это выражение:

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

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

  • необязательно http / s: //
  • опционально www
  • любое действительное буквенно-цифровое имя (включая - и _)
  • 1 или 2 вхождения любого действительного буквенно-цифрового имени (включая - и _)

Примеры проверки

1 голос
/ 16 июля 2014

В моем случае доменное имя считается действительным, если используется формат 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>";
    }
0 голосов
/ 25 июня 2017

Я сделал функцию для проверки доменного имени без каких-либо регулярных выражений.

<?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)строка (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)строка (11) "google.com."BOOL (истина)string (11) "goo gle.com" bool (false)строка (2) "а."BOOL (ложь)string (7) "hey.hey" bool (правда)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)строка (14) "www.google.com" bool (true)string (32) "www.google.com/some/path/to/dir/" bool (false)

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

0 голосов
/ 12 июня 2010

Помните, регулярные выражения могут только проверять, правильно ли что-то сформировано.«www.idonotexistbecauseiammadeuponthespot.com» правильно сформирован, но на самом деле не существует ... на момент написания статьи.;) Кроме того, некоторые провайдеры бесплатного веб-хостинга (например, Tripod) разрешают подчеркивание в поддоменах.Это явное нарушение RFC, но иногда оно работает.

Хотите проверить, существует ли домен?Попробуйте dns_get_record вместо (просто) регулярного выражения.

...