Как проверить доменное имя с помощью 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

Спасибо

Ответ 1

Как насчет:

^(?:[-A-Za-z0-9]+\.)+[A-Za-z]{2,6}$

Ответ 2

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

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

  • НЕ должен проверять домены, например:
    -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 символа в его текстовом представлении.
  • Каждая метка может состоять из букв, цифр и дефисов.
  • Ярлыки не могут запустить или конец с помощью дефиса.
  • Домен верхнего уровня (расширение) не может быть all-numeric.

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Примеры валидации

Ответ 5

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

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

Ответ 6

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

<?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) "a.b" 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 (true)


строка (11) "goo gle.com" bool (false)


string (2)" a." bool (false)


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)


строка (11)" google..com" bool (false)


string (14) "www.google.com" bool (true)


строка (32)" www.google.com/some/path/to/dir/" bool (false)

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