11

我知道这已经被问过一千次了(道歉),但是搜索 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:// 等...及其任何带有查询字符串的派生词应该退货...

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

4

5 回答 5

25

我只是使用 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>«.
*/
于 2013-09-07T06:11:18.817 回答
16

您可以使用来自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可能会有所帮助……</p>

于 2012-06-26T14:03:18.967 回答
2

以下正则表达式从字符串(包括查询字符串)中提取 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::// 字符串,反之亦然,因此您可以安全使用。:)

于 2019-01-10T10:37:24.123 回答
1

尝试这个

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

你可以使用这个网站来测试正则表达式http://gskinner.com/RegExr/

于 2012-06-26T14:05:07.483 回答
0

在 UIPath Studio 中定义了以下内置的正则表达式规则:

/(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)(?:\([-a-zA-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-a-zA-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-a-zA-Z0-9+&@#\/%=~_|$?!:,.]*\)|[a-zA-Z0-9+&@#\/%=~_|$])/

于 2021-10-22T09:23:15.537 回答