【问题标题】:Javascript: extract URLs from string (inc. querystring) and return arrayJavascript:从字符串(包括查询字符串)中提取 URL 并返回数组
【发布时间】:2026-02-07 01:40:01
【问题描述】:

我知道这已经被问过一千次了(抱歉),但是搜索 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 的其他地方存在,但我的搜索没有返回它,再次道歉..

【问题讨论】:

  • 人们应该停止在 JS 变量前加上 $... JS 不是 PHP!
  • 抱歉 - 我整天都在用 PHP,将删除!
  • Re: poss 重复,所列问题中的正则表达式并没有回答我列出的所有标准..
  • 你能接受答案吗?

标签: javascript jquery parsing url extract


【解决方案1】:

我只使用 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>«.
*/

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 请注意,使用正则表达式 - 特别是这个 - 可能会导致问题(“灾难性回溯”) - github.com/medialize/URI.js/issues/131 - 我会选择 @chovy 的答案并使用 URI.withinString()跨度>
    • 这个答案中的正则表达式容易受到来自"[https://*.com/questions/11209016/javascript-extract-urls-from-string-inc-querystring-and-return-array/11209098#11209098](https://*.com/questions/11209016/javascript-extract-urls-from-string-inc-querystring-and-return-array/11209098#11209098)"等字符串的ReDoS的攻击
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      试试这个

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】: