【问题标题】:Matching hostname on string when it has no protocol://?没有协议时匹配字符串上的主机名://?
【发布时间】:2011-10-18 20:09:30
【问题描述】:

我使用这个 js 代码来匹配字符串中的主机名:

url.match(/:\/\/(www\.)?(.[^/:]+)/);

当 url 以 protocol:// 开头时,此方法有效。例如:

这很好用:

var url = "http://domain.com/page";
url.match(/:\/\/(www\.)?(.[^/:]+)/);

但这不是:

var url = "domain.com/page";
url.match(/:\/\/(www\.)?(.[^/:]+)/);

我试过了:

url.match(/(:\/\/)?(www\.)?(.[^/:]+)/);

当它不包含协议://时,它与主机名匹配得很好,但当它包含它时,它只返回协议而不是主机名。

如果域不包含域,我该如何匹配它?

【问题讨论】:

    标签: javascript regex string parsing pattern-matching


    【解决方案1】:

    我使用了来自 Steven Levithan 的 this function,它可以很好地解析 url。

    这里是你如何使用这个函数

      alert(parseUri("www.domain.com/foo").host)
    

    【讨论】:

    • 这不是答案,而是评论。
    • @FailedDev 我会说这是一个简洁的非高质量答案。但这是解决 OP 问题的可能方法。
    • @xanatos 我没有说这不是解决方案。但是简单的链接可以简单地转到 cmets 吗?还是我弄错了?
    • @FailedDev:我已经用代码示例扩展了答案,请看一下。
    • @thg435 我对你没有意见。但是当我发布一个外部链接作为问题的答案时,我也得到了同样的“待遇”。我恢复了我的反对票。
    【解决方案2】:

    好的,在您从@xanatos 回答大脑崩溃之前,这里是一个满足基本需求的简单正则表达式。其他答案比这个正则表达式更完整,处理更多案例:

    (?:(?:(?:\bhttps?|ftp)://)|^)([-A-Z0-9.]+)/
    

    第 1 组将使用您的主机名。 URL 解析与正则表达式有关。你走在正确的轨道上。你有两个部分工作的正则表达式。我只是将它们组合在一起。

    编辑:昨天晚上我很累。这是 jscript 的正则表达式

    if (subject.match(/(?:(?:(?:\bhttps?|ftp):\/\/)|^)([\-a-z0-9.]+)\//i)) {
        // Successful match
    } else {
        // Match attempt failed
    }
    

    【讨论】:

    • +1 小提示:你应该告诉他激活忽略大小写,最后转义/,也许添加对IPv6 地址的支持(好吧......我在这里夸大其词) ....我通常会尽量保持连贯。如果您在某处使用小写字母,则始终使用小写字母。啊,你把他带走了 :port 的“选择”(他接受了)......你和他都不支持http://username:password@site
    【解决方案3】:

    这个

    var rx = /^(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?:\w+:\w+@)?(?:(?:[-\w]+\.)+(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?::[\d]{1,5})?(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$/;
    

    应该是 uber-url 解析正则表达式 :-) 取自这里http://flanders.co.nz/2009/11/08/a-good-url-regular-expression-repost/

    在这里测试:http://jsfiddle.net/Qznzx/1/

    它显示了正则表达式的无用。

    【讨论】:

    • 哈哈。 +1 只是为了“正则表达式的无用”:D
    【解决方案4】:

    这可能比必要的复杂一点,但它似乎有效:

    ^((?:.+?:\/\/)?(?:.[^/:]+)+)$ 
    
    1. 协议的非捕获组。从字符串的开头 匹配任意数量的字符,直到出现:。可能有零个或一个 协议。
    2. url 其余部分的非捕获组。这部分必须存在。
    3. 将所有内容归为一组。

    【讨论】:

    • 我会写 ^(?:[^:]+:\/\/)?([^\/:]+) 来获取主机名。
    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多