gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:43:19 25 4
gpt4 key购买 nike

我需要计算 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 = /^[^&$+,\/:=?@ <>\[\]\{\}\\^~%#]+$/;

最佳答案

您的 URL 正则表达式看起来可能既严重矫枉过正,又错过了某些情况。

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

这里有一个 JSFiddle 可以实现这个目的:http://jsfiddle.net/m5ny4/1/

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>');
}

我使用的模式是电子邮件和 URL,但比上面显示的模式大大简化了。它可以减少一点(将它们更紧密地结合起来),但我选择将它们分开并通过管道将它们连接在一起,因为这样更易于阅读。

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

第一个 block 用于电子邮件。忽略它周围的 (?: ) ,您将得到 [^\s]+@[a-z]+(\.[a-z]+)+[^\s]+ 匹配 @ 符号之前的任何非空白字符。后记,它与具有任意数量的子域或顶级域的任何域相匹配(例如 google.com、google.co.uk)。

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

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

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

我只是将它们输出到一个列表中,但是您可以通过替换 for 循环来执行任何您想要的操作。

关于javascript - 如何使用 JavaScript 返回字符串中每个链接的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21998838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com