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

时间:2012-06-26 13:59:03

标签: javascript jquery parsing url extract

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

基本上,我需要一个JS函数,当传递一个字符串时,识别&基于正则表达式提取所有URL,返回所有找到的数组。 e.g:

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

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

将字符串(searchText)拆分为不同的部分(开始/结束),其中任何一个,空格或回车的任何一侧都返回,从而产生不同的内容块,例如,做分裂。

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

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

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

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

  

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

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

4 个答案:

答案 0 :(得分:18)

我只使用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 "<a>" + url + "</a>";
});

/* result is:
Hello <a>www.example.com</a>,
<a>http://google.com</a> is a search engine, like <a>http://www.bing.com</a>
<a>http://exämple.org/foo.html?baz=la#bumm</a> is an IDN URL,
<a>http://123.123.123.123/foo.html</a> is IPv4 and <a>http://fe80:0000:0000:0000:0204:61ff:fe9d:f156/foobar.html</a> is IPv6.
links can also be in parens (<a>http://example.org</a>) or quotes »<a>http://example.org</a>«.
*/

答案 1 :(得分:14)

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

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

String#match和/或String#replace可能会有所帮助......

答案 2 :(得分:1)

试试这个

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

您可以使用此网站测试正则表达式http://gskinner.com/RegExr/

答案 3 :(得分:0)

以下正则表达式从字符串(包括查询字符串)中提取URL并返回数组

var url = "asdasdla hakjsdh aaskjdh https://www.google.com/search?q=add+a+element+to+dom+tree&oq=add+a+element+to+dom+tree&aqs=chrome..69i57.7462j1j1&sourceid=chrome&ie=UTF-8 askndajk nakjsdn aksjdnakjsdnkjsn";

var matches = strings.match(/\bhttps?::\/\/\S+/gi) || strings.match(/\bhttps?:\/\/\S+/gi);

输出:

["https://www.google.com/search?q=format+to+6+digir&…s=chrome..69i57.5983j1j1&sourceid=chrome&ie=UTF-8"]

注意: 这可以处理带单冒号的http://和带双冒号的http :: //,对于https则相反,因此对您来说是安全的。 :)