如何使用JavaScript返回字符串中每个链接的长度?

如何使用JavaScript返回字符串中每个链接的长度?,javascript,jquery,regex,Javascript,Jquery,Regex,我需要用JavaScript计算字符串中链接的长度和数量 下面是我希望做的一个例子: var myString = 'Lorem ipsum dolor sit amet, www.google.com/abc consectetur adipiscing elit. http://stackoverflow.com/question/ask Donec sed magna ultricies.' function getLinkLength(myString) { // do stuf

我需要用JavaScript计算字符串中链接的长度和数量

下面是我希望做的一个例子:

var myString = 'Lorem ipsum dolor sit amet, www.google.com/abc consectetur adipiscing elit. http://stackoverflow.com/question/ask Donec sed magna ultricies.'
function getLinkLength(myString) {
    // do stuff. ha!
    return linkArray; // returns [0] => 18, [1] => 37
}
输出应该告诉我字符串中所有链接的长度,如下所示:

www.google.com/abc = 18
http://stackoverflow.com/question/ask = 37
你能帮我解析一个链接字符串并返回每个字符串的长度吗?电子邮件地址也应算作链接(例如。email@domain.com=16)

这是一个字符计数器,我不想因为链接长度而惩罚字符,所以我需要为我的计数器减去字符串中所有链接的长度

这里有一些我想用的正则表达式。我意识到这些并不完美,但如果我能处理好基本的链接,我会牺牲角落案例

regexes.email = /^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/;
regexes.url = /^(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?:\w+:\w+@)?((?:(?:[-\w\d{1-3}]+\.)+(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|edu|co\.uk|ac\.uk|it|fr|tv|museum|asia|local|travel|[a-z]{2}))|((\b25[0-5]\b|\b[2][0-4][0-9]\b|\b[0-1]?[0-9]?[0-9]\b)(\.(\b25[0-5]\b|\b[2][0-4][0-9]\b|\b[0-1]?[0-9]?[0-9]\b)){3}))(?::[\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})*)?$/i;
regexes.cc = /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,
regexes.urlsafe = /^[^&$+,\/:=?@ <>\[\]\{\}\\^~%#]+$/;
[代码>regEXE.代码>regEXE.网页网页网页网页网页网页网页的主要主要码码>regEXEXE.网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页.......网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页........网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页网页(a-zA-Z0-9)(a-zA-Z0-9)(a-zA-Z0-9)(a-zA-Z0-9)(a)(a)(a)((((01)))2((0-4)))d)25((0-5)); 目前,除了除了除了以下几::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::|travel |[a-z]{2}]|(\b25[0-5]\b |\b[2][0-4][0-9]\b |\b[0-1]?[0-9]?[0-9]?[0-9]?[0-9]。(\.(\b25[0-5]\b |\b[b[2][0-4][0-9]。\b |[0-1]?[0-9]?){3](::::::::::::::/)(\)目前,在以下以下几种:(以下以下以下以下?:(::)以下以下:(:(以下以下以下以下以下以下以下以下以下以下以下以下以下以下:(:(:(以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下??????::::(以下以下以下以下以下以下以下以下以下以下以下???,,,,,,,,,,,,[[[[[[[3-f-f\d][[2]除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除除上述外外外外,,[2}可能可能之外以外以外以外以外以外以外以外以外以外以外,任何其他任何其他任何其他任何其他任何其他任何其他任何一名名名名无无无无无无无无无无无无无无无可能可能可能可能可能的任何其他任何其他任何其他任何其他任何其他任何其他任何任何可能可能)))))))))可能可能,(,(,(,(+|,*:=]|%[a-f\d]{2})**)*(?:#)(?:[-\w~!$\/,*:;=]|%[a-f\d]{2})*)?$/i; regexes.cc=/^(?:4[0-9]{12}(?:[0-9]{3})| 5[1-5][0-9]{14}6(?:011 | 5[0-9][0-9])[0-9]{12}3[47][0-9]{13}3(?:0[0-5][68][0-9][0-9]{11}(?:2131 | d}{35}}, regexes.urlsafe=/^[^&$+,\/:=?@\[\]\\\\\\\\\\\\\\\\\\\\\^~%\\\\]+$/;
您的URL正则表达式看起来可能是严重的过度使用,也可能遗漏了某些情况

最好使用更简单的URL正则表达式(除非您有明确的理由需要该特定模式)

下面是一个JSFIDLE,它实现了以下功能:

var输入=”http://google.com google.com/abcpie@pie.com cookies@some.longer.domainwww.cookies.comftps://a.b.c.d/cookies someone@gmail.com";
var模式=/(?:[^\s]+@[a-z]+(\.[a-z]+)+)。(?:(?:[a-z]+:\/\/)\s)[a-z]+(\.[a-z]+)+(\/[^\s]*)/g;
var matches=input.match(模式);
for(var i=0,len=matches.length;i'+匹配[i]+“=”+匹配[i].length+'');
}
我使用的模式是电子邮件和URL,但与上面显示的模式相比大大简化了。它可以减少一点(将它们更紧密地结合起来),但我选择将它们分开,并将它们连接在一起,因为这样更容易阅读

正则表达式基本上有两大块:
(?:[^\s]+@[a-z]+(\.[a-z]+)
(?:(?:[a-z]+:\/\/)\s)[a-z]+(\.[a-z]+)+(\/[^\s]*)

第一块是电子邮件。忽略包裹在它周围的
(?:)
,你有
[^\s]+@[a-z]+(\.[a-z]+
[^\s]+
匹配@符号前的任何非空格字符。之后,它匹配任何具有任意数量的子或顶级域的域(例如google.com、google.co.uk)

第二个
(?:(?:(?:[a-z]+:\/\/)\s)[a-z]+(\.[a-z]+)+(\/[^\s]*)
是URL。第一个有意义的部分是
(?:[a-z]+:\/\/)\124;\ s)
,它将匹配任何协议或空白字符(告诉它的起始位置)。如果您想将其限制在某些协议中,只需替换
[a-z]+
使用您想要的协议

接下来是匹配第一个(子)域的
[a-z]+
,然后是匹配一个或多个附加域的
(\.[a-z]+)+
(因为您至少需要两个域才能创建合法的域名)。最后,我们有
(\/[^\s]*)
,可以选择匹配所有域,直到找到空白

剩下的很简单。全局匹配(模式末尾的
g
)以获得所有匹配项,然后循环遍历它们并对字符串使用
.length
以获得它们的长度


我只是将它们输出到一个列表中,但是你可以通过替换for循环来做任何你想做的事情。

哇!这是一个快速而全面的过程。谢谢!非常有效。
var input = "http://google.com google.com/abc pie@pie.com cookies@some.longer.domain www.cookies.com ftps://a.b.c.d/cookies someone@gmail.com";
var pattern = /(?:[^\s]+@[a-z]+(\.[a-z]+)+)|(?:(?:(?:[a-z]+:\/\/)|\s)[a-z]+(\.[a-z]+)+(\/[^\s]*)?)/g;

var matches = input.match(pattern);

for (var i = 0, len = matches.length; i < len; i++) {
    $('ul').append('<li>' + matches[i] + " = " + matches[i].length + '</li>');
}