【问题标题】:Regex help: subdomain check正则表达式帮助:子域检查
【发布时间】:2010-12-29 06:27:32
【问题描述】:

嘿,我有一个表单,用户可以在其中输入 value.google.com 之类的子域,并且该条目将是“有效”

我想运行一个正则表达式检查(我在正则表达式方面非常糟糕),它执行以下操作:

第一个字符:不能是符号 中间字符:a-z、A-Z 和符号 - 和 .只要 最后一个字符:不能是符号

如果测试失败,我希望它吐出 false。

谁能帮我解决这个问题?谢谢!

你们认为还有其他限制吗?

【问题讨论】:

    标签: php regex validation url


    【解决方案1】:

    你需要的是一个字符类。 :)

    • [a-zA-Z\-\.] 将匹配“a-zA-Z-.”类型的字符。
    • [a-zA-Z] 将匹配“a-zA-Z”类型的字符。
    • ^ 表示行首
    • $ 表示行尾
    • + 表示“一次或多次”

    所以你正在寻找的是: ^[a-zA-Z][a-zA-Z\-\.]+[a-zA-Z]$

    而且由于你在 PHP 中可以设置 i-flag,它变得不区分大小写,并且这段代码应该可以工作:

    
      if (preg_match("/^[a-z][a-z\-\.]+[a-z]$/i", "valid.google.com")) {
       echo "A match was found.";
      } else {
       echo "A match was not found.";
      }
    

    提示:你不应该也包括数字吗? [a-z0-9]

    【讨论】:

    • 嘿,非常感谢。你是对的......我应该包括数字。问题是“有效”字符串已经没有.google.com,所以我不必搜索字符串。我只是想检查“有效”字符串是否以符号开头或结尾,并且中间字符是 a-z、A-Z、0-9、.,或者 - 我该怎么做?
    • [A-Z0-9.-](而不是[a-zA-Z0-9\-\.])就足够了。您已经设置了 i 修饰符,所以它已经不区分大小写了。无需转义字符类中的点,如果将破折号放置在字符类的开头或结尾,则无需转义。
    • 嘿,蒂姆,如果我使用 substr 将字符串分成三个部分,第一个字符、middel 和最后一个字符,我可以在每个部分上运行预匹配吗?第一个和最后一个字符是 [a-zA-Z0-9],中间字符是 [a-zA-Z0-9\-\.]。对吗?
    【解决方案2】:

    如果 TLD 始终为 com,您应该可以这样做:

    /^(.*)\.[^.]+\.com$/
    

    这将匹配最右边的 . 字符之前的任何内容(不包括 .com)。

    但是,您可能希望使用简单的字符串操作来代替 (strrpos())。或者,您可以在. 上拆分:

    function extract_sub($domain) {
            $parts = explode('.', $domain);
    
            return implode('.', array_slice($parts, 0, -2));
    }
    

    (Demo)

    【讨论】:

      【解决方案3】:

      我认为这可能是最常见的情况。

      $subdomain = "usersubdomain";
      
      if(preg_match("/^[A-Z0-9]+$/i", $subdomain)) {
         echo "Valid sub domain";
        }else{
         echo "Not a valid sub domain.";
        }
      

      【讨论】:

      • 这与原始发布者列出的规则不太相符。
      猜你喜欢
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 2011-06-10
      相关资源
      最近更新 更多