Javascript:从string(inc。查询字符串)中提取URL并返回数组

我知道这已被问过一千次(道歉),但搜索SO / Google等我还没有得到一个确定的答案。

基本上,我需要一个JS函数,当传递一个字符串时,根据正则表达式识别和提取所有URL,返回所有找到的数组。 例如:

function findUrls(searchText){ var regex=??? result= searchText.match(regex); if(result){return result;}else{return false;} } 

该函数应该能够检测并返回任何潜在的URL。 我知道这个(括号括号等)的不良困难/问题,所以我觉得这个过程需要:

将字符串( searchText )拆分为不同的部分(开始/结束),其中任何一个,空格或回车都返回它,导致不同的内容块,例如进行拆分。

对于由拆分产生的每个内容块,请查看它是否适合任何构造的URL的逻辑,即它是否包含紧跟在文本后面的句点(用于限定潜在URL的一个常量规则)。

正则表达式应该查看句点是否紧跟其他文本后面的类型,包括tld,目录结构和查询字符串允许的类型,以及URL的允许类型的文本。

我知道可能会导致误报,但是会通过调用URL本身来检查任何返回的值,因此可以忽略这一点。 我发现的其他函数通常也不会返回URL查询字符串(如果存在)。

因此,从一个文本块,该函数应该能够返回任何类型的URL,即使这意味着将will.i.am识别为有效的URL!

例如。 http://www.google.com,google.com,www.google.com,http ://google.com,ftp.google.com,https://等等……以及带有查询字符串的任何派生应该退还…

非常感谢,再次道歉,如果它存在于其他地方,但我的搜索没有返回它..

我只是使用URI.js – 让它变得简单。

 var source = "Hello www.example.com,\n" + "http://google.com is a search engine, like http://www.bing.com\n" + "http://exämple.org/foo.html?baz=la#bumm is an IDN URL,\n" + "http://123.123.123.123/foo.html is IPv4 and " + "http://fe80:0000:0000:0000:0204:61ff:fe9d:f156/foobar.html is IPv6.\n" + "links can also be in parens (http://example.org) " + "or quotes »http://example.org«."; var result = URI.withinString(source, function(url) { return "" + url + ""; }); /* result is: Hello www.example.com, http://google.com is a search engine, like http://www.bing.com http://exämple.org/foo.html?baz=la#bumm is an IDN URL, http://123.123.123.123/foo.html is IPv4 and http://fe80:0000:0000:0000:0204:61ff:fe9d:f156/foobar.html is IPv6. links can also be in parens (http://example.org) or quotes »http://example.org«. */ 

你可以使用URI.js中的正则表达式:

 // gruber revised expression - http://rodneyrehm.de/t/url-regex.html var uri_pattern = /\b((?:[az][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”'']))/ig; 

String#match和String#replace可以帮助…

试试这个

 var expression = /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[az]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi; 

你可以使用这个网站来测试regexp http://gskinner.com/RegExr/