【问题标题】:Extract links in a string and return an array of objects提取字符串中的链接并返回对象数组
【发布时间】:2015-04-18 14:58:24
【问题描述】:

我从服务器收到一个字符串,该字符串包含文本和链接(主要以 http://、https:// 和 www. 开头,很少有不同,但如果它们不同,则无关紧要)。

例子:

"simple text simple text simple text domain.ext/subdir again text text text youbank.com/transfertomealltheirmoney/witharegex text text text and again text"

我需要一个执行以下操作的 JS 函数: - 查找所有链接(无论是否有重复); - 返回一个对象数组,每个对象代表一个链接,以及返回链接在文本中开始位置和结束位置的键,例如:

[{link:"http://www.dom.ext/dir",startsAt:25,endsAt:47},
{link:"https://www.dom2.ext/dir/subdir",startsAt:57,endsAt:88},
{link:"www.dom.ext/dir",startsAt:176,endsAt:192}]

这可能吗?怎么样?

编辑:@Touffy:我试过了,但我不知道任何字符串有多长,只有起始索引。而且,这并没有检测到www:var str = string with many links (SO does not let me post them)" var regex =/(\b(https?|ftp|file|www):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; var result, indices = []; while ( (result = regex.exec(str)) ) { indices.push({startsAt:result.index}); }; console.log(indices[0].link);console.log(indices[1].link);

【问题讨论】:

  • 是的,有可能!
  • @adeneo:非常好的评论,谢谢! ;-)
  • 请显示输入示例
  • 既然您知道这是可能的,那么您可以尝试一下。如果您这样做时它不起作用,您可以发布您的代码,我们将解释原因。 (提示:使用indexOfmatch 字符串方法)
  • @Touffy:你说得对,我会尽快做的

标签: javascript url text extract


【解决方案1】:

解决此问题的一种方法是使用正则表达式。假设任何输入,您都可以执行类似的操作

 var expression = /(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/gi;
 var matches = input.match(expression);

然后,您可以使用indexOf 遍历匹配以发现起点和终点

for(match in matches)
    {
        var result = {};
        result['link'] = matches[match];
        result['startsAt'] = input.indexOf(matches[match]);
        result['endsAt'] = 
            input.indexOf(matches[match]) + matches[match].length;
     }

当然,您可能需要修改正则表达式本身以满足您的特定需求。

你可以在这个fiddle看到控制台记录的结果

【讨论】:

  • 这是我一直在寻找的,但我使用了 exec,而在这种情况下 match 是更好的选择,谢谢
猜你喜欢
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
相关资源
最近更新 更多