【问题标题】:Javascript simple regex to find root domainJavascript简单的正则表达式来查找根域
【发布时间】:2013-02-11 07:43:05
【问题描述】:

我有一个使用正则表达式返回给定 url 的根域的函数。

http://jsfiddle.net/hSpsT/

function cleanUp(url) {
  url = url.replace(new RegExp(/^\s+/),""); // START
  url = url.replace(new RegExp(/\s+$/),""); // END

  // IF FOUND, CONVERT BACK SLASHES TO FORWARD SLASHES
  url = url.replace(new RegExp(/\\/g),"/");

  // IF THERE, REMOVES 'http://', 'https://' or 'ftp://' FROM THE START
  url = url.replace(new RegExp(/^http\:\/\/|^https\:\/\/|^ftp\:\/\//i),"");

  // IF THERE, REMOVES 'www.' FROM THE START OF THE STRING
  url = url.replace(new RegExp(/^www\./i),"");
  //remove slash from end
  url = url.replace(new RegExp(/\/$/i),"");    
  return url;
}

但它使用多正则表达式,我们担心性能。有没有更好的方法在单行正则表达式中做同样的事情?

注意:

document.location.host 在我的情况下似乎不起作用。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    Extract hostname name from string

    试试:

    function cleanUp(url) {
        var url = $.trim(url);
        if(url.search(/^https?\:\/\//) != -1)
            url = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i, "");
        else
            url = url.match(/^([^\/?#]+)(?:[\/?#]|$)/i, "");
        return url[1];
    }
    
    alert(cleanUp('  http://www.google.com/about.html'));
    alert(cleanUp('  www.google.com/about.html'));
    

    【讨论】:

    • 我已经为 www.google.com 更新了它,jsfiddle.net/svjTC/1,在这种情况下它可能会失败,我们可以扩展它吗?
    • 太棒了。将此添加到 end url[1] = url[1].replace(/^www\./i, "");删除 www。在我看来很好。非常感谢。
    • 谢谢,但 trim 似乎在内部使用正则表达式,这是额外的开销。正在寻找它在现有的正则表达式中发生。
    • @Selvam 在使用正则表达式进行修剪方面,这是一篇很棒的效率分析文章:link。另外,对于常见的 javascript 正则表达式,请参阅:link
    【解决方案2】:

    试试这个:

    http://jsfiddle.net/picklespy/gb34u/1/

    它适用于所有现代浏览器,甚至适用于 IE 5.5+。

    var url = document.createElement('a');
    url.href = 'http://maps.test.google.com';
    var host = url.hostname;
    
    host = host.split('.');
    
    var domain = host.pop();
    domain = host.pop() + '.' + domain;
    
    alert('Root is: ' + domain)
    

    【讨论】: