Простое регулярное выражение для доменных имен - PullRequest
2 голосов
/ 12 октября 2011

Как убедиться, что доменное имя соответствует этим 3 простым критериям:

  • Заканчивается на .com / .net

Не должен начинаться с

  • http: // или https: //
  • http://www. или https://www.

Мне удалось понять эту часть регулярного выражения, которая соответствует первым критериям:

/.*(\.com|\.net)$/

Но я понятия не имею, как выполнить еще 2 условия для создания уникального регулярного выражения.

Спасибо за вашу помощь.

Ответы [ 5 ]

4 голосов
/ 12 октября 2011

«Не запускать» с шаблоном немного сложно.

Самый ясный способ сделать это - два отдельных регулярных выражения, одно из которых соответствует тому, что вы хотите, а другое не соответствует тому, что вы не хотите.

Но вы можете сделать это за один раз с отрицательным прогнозом:

/^(?!https?:\/\/(www\.)?).*(\.com|\.net)$/

Редактировать : исправить утверждение, как указаноridgerunner

2 голосов
/ 13 октября 2011

Регулярное решение легко.Просто установите отрицательный взгляд на начало строки следующим образом: (С комментариями ...)

if (preg_match('%
    # Match non-http ,com or .net domain.
    ^             # Anchor to start of string.
    (?!           # Assert that this URL is NOT...
      https?://   # HTTP or HTTPS scheme with
      (?:www\.)?  # optional www. subdomain.
    )             # End negative lookahead.
    .*            # Match up to TLD.
    \.            # Last literal dot before TLD.
    (?:           # Group for TLD alternatives.
      net         # Either .net
    | com         # or .com.
    )             # End group of TLD alts.
    $             # Anchor to end of string.
    %xi', $text)) {
    // It matches.
} else {
    // It doesn't match.
}

Обратите внимание, что, поскольку: http://www. является подмножеством: http://, выражение длянеобязательно www. не обязательно.Вот более короткая версия:

if (preg_match('%^(?!https?://).*\.(?:net|com)$%i', $text)) {
    // It matches.
} else {
    // It doesn't match.
}

Простое регулярное выражение в помощь!

2 голосов
/ 12 октября 2011

Если вам нужно быть уверенным, что строка не будет содержать первые две точки, почему бы вам просто не использовать str_replace, а затем выполнить тестирование по первым критериям?Я думаю, что это будет проще и, безусловно, более эффективно.

0 голосов
/ 12 октября 2011

Попробуйте это:

if(preg_match('/^(?:http://|https://)(?:[w]{3}|)/i', $subject))
{
  echo 'Fail';
}
else
{
  if(preg_match('/(?:.*(\.com|\.net))$/i', $subject))
  {
    echo 'Pass';
  }
  else
  {
    echo 'Fail';
  }
}
0 голосов
/ 12 октября 2011
^[a-zA-Z\.]+\.(com|net)$

это работает?

хорошо, если я вас правильно понял, вы хотите проверить список строк и выяснить, какие доменные имена.например,

http://www.a.b (F)
a.com (T)
b.net  (T)
https://google.com (F)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...