提取字符串中的链接和 return 对象数组
Extract links in a string and return an array of objects
我从服务器收到一个字符串,这个字符串包含文本和 links(主要以 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(不管是否有重复);
- return 是一个对象数组,每个对象代表一个 link,以及 return 的键,其中 link 在文本中开始和结束的位置,例如:
[{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);
解决这个问题的一种方法是使用正则表达式。假设无论输入什么,你都可以做类似
的事情
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
看到控制台记录的结果
我从服务器收到一个字符串,这个字符串包含文本和 links(主要以 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(不管是否有重复); - return 是一个对象数组,每个对象代表一个 link,以及 return 的键,其中 link 在文本中开始和结束的位置,例如:
[{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);
解决这个问题的一种方法是使用正则表达式。假设无论输入什么,你都可以做类似
的事情 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
看到控制台记录的结果