【问题标题】:Regex to match subdomains other than "www"正则表达式匹配“www”以外的子域
【发布时间】:2010-11-25 15:23:38
【问题描述】:

大家好。现在我的 PHP 应用程序上有这个正则表达式:

$regex = '#^(www\.)*([^www][a-z0-9-]+)\.tanlup\.local$#';

这是我需要它做的事情:

MATCH www.something.tanlup.local  
MATCH something.tanlup.local

NOT MATCH www.tanlup.local  
NOT MATCH tanlup.local

问题是当我有一个以“w”开头的子域时,它不匹配!有谁知道为什么以及如何让它变得更好?

谢谢!

【问题讨论】:

    标签: php regex url


    【解决方案1】:

    为这样的一次性情况构建过于复杂的正则表达式是弄巧成拙的。构建一个非常通用的正则表达式并将某些域列入黑名单可能会更好:

    $regex = '/^([-\w]+.)+tanlup.local$/';
    $disallowed = array ('www.tanlup.local', 'tanlup.local');
    
    if (preg_match($regex, $str) && false === array_search($str, $disallowed) {
      // success
    }
    

    【讨论】:

      【解决方案2】:

      [^www] 不会做你认为的那样。你是说你不想要一个'w'字符。

      【讨论】:

      • 你忘了说为什么不这样做。 [ ] 引入了一个字符列表,而不是一个字符序列(作为普通括号)。
      • 那我怎么说我不想要三个 w 的序列呢?
      【解决方案3】:

      你需要一个negative lookbehind assertion:

      ^.*(?<!^www)\.tanlup\.local$
      

      请注意,并非所有正则表达式引擎都支持后向搜索,但我相信 PHP 支持。

      【讨论】:

      • not-www.tanlup.local 失败。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多