【问题标题】:Filter address url [closed]过滤器地址 url [关闭]
【发布时间】:2013-05-07 22:57:18
【问题描述】:

我有这个示例字符串列表:

var s="http://www.website1.com/, http://www.website2.es/forum/something, http://website3.info, website4.is";

输出将是:

网站1.com 网站2.es 网站3.info 网站.is

如何在 jquery javascript 中使用 minimum fuzz 来实现这一点?

【问题讨论】:

  • 您需要使用数组吗?

标签: javascript jquery regex


【解决方案1】:

不是最有效的,但使用 php.js (http://phpjs.org/functions/parse_url/) 中的 parse_url:

var sList = "http://www.website1.com/, http://www.website2.es/forum/something, http://website3.info, website4.is";

var aStr = sList.split(', ');

var sResult = "";

for(var i in aStr) 
{
  var oUrlParts = parse_url(aStr[i]);
  sResult += oUrlParts['host']+"\n\n";
}

console.log(sResult);

【讨论】:

  • 你测试过这个吗?它为第四个值“website4.is”提供undefined,并将“www”子域保留在前两个值上。 jsfiddle.net/KUGbN
  • 已确认。似乎需要在字符串中以protocol:// 开头,否则它会给出undefinedjsfiddle.net/KUGbN/2
【解决方案2】:

为什么不简单地这样做:

//your string:
var str=("http://www.website1.com/, http://www.website2.es/forum/something, http://website3.info, website4.is");

//my function:
function gtBaseUrl(s){ 
    return s.split('://').pop().split('/')[0]; 
}

//example use:
var lnks=str.split(', ');

for(var i=0, L=lnks.length; i < L; i++){
    //do stuff with each url
    alert( gtBaseUrl(lnks[i]).replace(/^www./i,'') );
    //if you don't want www. stripped then remove: ' .replace(/^www./i,'') '
}

工作 jsfiddle 演示 here.

您可以将 for 循环修改为您需要的任何(格式化输出)(使用 innerHTMLbr \n for in textarea 等)

【讨论】:

  • 您明确地剥离了“www”子域,但是任何其他子域(foo.bar.com)呢?子域可能应该被全面包含或排除,而不是像这样选择性地。
  • @DaggNabbit:我知道,但是 foo.co.ukwww.foo.co.uk 呢?确实,(对于其他读者)省略.replace(/^www./i,'') 可能会更好,但它不符合提问者的问题,其中 www 被剥离。
  • 是的,这就是尝试删除子域的问题,您需要对照实际的 TLD 列表检查它,而且它是一个冗长的列表...实际上您的答案是这里唯一真正做到的OP要求什么(至少考虑到他的样本数据)。我只留下了我的答案,因为它给出的结果与接受的答案相同,但代码更少。
  • 无法缩短该列表,因此它只包含.co.uk 之类的案例?我注意到锚点hostname 属性(来自您的回答)似乎在删除protocol:// 之后返回了第一个/ 之前的所有内容(所以看来s.split('://').pop().split('/')[0] 会给出相同的结果)。作为旁注(对这些有趣的 cmets):我的理解是当前的“约定”是 www 通常是根的别名(即 foo.com),但在严格的情况下你是绝对正确的!
  • 有时我认为它甚至比这更复杂。以佛罗里达惩教署为例:www.dc.state.fl.us ... 该怎么办?
【解决方案3】:

在 JavaScript 中执行此操作的常用方法是创建一个 a 元素,将 URL 分配给其 href 属性,然后获取其 hostname 属性。

var a = document.createElement('a');
a.href = "http://stackoverflow.com/questions/16429929/filter-address-url";
console.log(a.hostname); // "stackoverflow.com"

没有外部依赖,三行代码。


当然,你也可以这样做:

"http://stackoverflow.com/questions/16429929/filter-address-url".split('/')[2]

从您的问题来看,您似乎不希望结果中出现子域(“www”),但是由于您接受了返回子域的答案(并且在第四个值上失败),所以我将把它留在这里。

【讨论】:

  • +1 表示正确的方式。但是"http://stackoverflow.com/questions/16429929/filter-address-url".split('/')[2] 将无法使用询问者的示例(其中 url 没有 http://)。 PS,你觉得我的回答怎么样?你能想出一个我的函数会失败的有效网址吗?
  • @GitaarLAB,好点(不过,接受的答案在那里也失败了,而且实际上它不是一个正确的 URL,所以“真正的”解决方案,不管它是什么,可能“应该”在那里失败): ) 刚刚对您的回答发表了评论...
猜你喜欢
  • 2015-04-06
  • 2016-12-04
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 2011-11-02
  • 2013-08-21
  • 2018-10-31
相关资源
最近更新 更多