【问题标题】:Simple regex for domain names域名的简单正则表达式
【发布时间】:2011-12-06 05:17:39
【问题描述】:

如何确保域名符合这 3 个简单标准:

  • 以 .com / .net 结尾

不能以开头

  • http:// 或 https://
  • http://www.或 https://www.

我已经设法理解了与第一个条件相对应的正则表达式的这一部分:

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

但我不知道如何实现另外两个条件来制作独特的正则表达式。

感谢您的帮助。

【问题讨论】:

  • 如果您需要确保字符串不包含前两个点,为什么不简单地使用 str_replace 然后测试第一个条件?我认为这会更容易,而且肯定会更有效。
  • 使正则表达式匹配 http:// 等,然后得到 !返回的布尔值
  • 嗯,是的,你是对的,这很容易。我可以解决这个问题。 :-)
  • 您对问题的表述过于简单。在一般情况下,这不能通过正则表达式解决。见*.com/questions/1201194/…

标签: php regex dns


【解决方案1】:

“不开始”模式有点棘手。

最清晰的方法是使用两个独立的正则表达式,一个匹配你想要的,一个不匹配你不想要的。

但是你可以在一个消极的前瞻性的情况下做到这一点:

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

编辑:更正 ridgerunner 指出的断言

【讨论】:

  • 行不通。从字符串的开头,^ 你想使用否定的 lookahead 而不是否定的lookbehind。这里需要的表达式是:/^(?!https?:\/\/(www\.)?).*(\.com|\.net)$/
  • @Ridgerunner:你是对的。我已经纠正了。棘手的事情,这些外观。
【解决方案2】:

正则表达式解决方案很简单。只需在字符串的开头断言一个否定的前瞻,如下所示:(With cmets...)

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.
}

简单的正则表达式来拯救!

【讨论】:

    【解决方案3】:

    试试这个:

    if(preg_match('/^(?:http://|https://)(?:[w]{3}|)/i', $subject))
    {
      echo 'Fail';
    }
    else
    {
      if(preg_match('/(?:.*(\.com|\.net))$/i', $subject))
      {
        echo 'Pass';
      }
      else
      {
        echo 'Fail';
      }
    }
    

    【讨论】:

      【解决方案4】:

      如果您需要确保字符串不包含前两个点,为什么不简单地使用 str_replace 然后测试第一个条件?我认为这会更容易,而且肯定会更有效。

      【讨论】:

        【解决方案5】:
        ^[a-zA-Z\.]+\.(com|net)$
        

        这行得通吗?

        好吧,如果我理解正确的话,你想检查一个字符串列表,找出哪些是域名。例如

        http://www.a.b (F)
        a.com (T)
        b.net  (T)
        https://google.com (F)
        

        【讨论】: