【问题标题】:Javascript regex parse complex url stringJavascript正则表达式解析复杂的url字符串
【发布时间】:2020-01-10 10:14:39
【问题描述】:

我需要解析一个复杂的 URL 字符串来获取特定的值。

来自以下 URL 字符串:

/api/rss/feeds?url=http://any-feed-url-a.com?filter=hot&format=rss&url=http://any-feed-url-b.com?filter=rising&format=rss

我需要把这个结果提取成数组格式:

['http://any-feed-url-a.com?filter=hot&format=rss', 'http://any-feed-url-b.com?filter=rising&format=rss']

我已经尝试过使用这个/url=([^&]+)/,但我无法正确捕获所有查询参数。我想省略url=

RegExr link

提前致谢。

【问题讨论】:

  • 我想省略 url= - 你已经省略了它,因为它不是捕获组的一部分。您的数据在第 1 组中。我认为您需要 var regex = /url=(.+?)(?=&url=|$)/g,运行 regex.exec(str) in a loop 并获取第 1 组。
  • 您正在使用捕获组,这就是值所在的位置。试试url=(.*?)(?=&url=|$))regex101.com/r/snM42Q/1
  • 您是否考虑过使用查询字符串解析库而不是使用正则表达式?

标签: javascript regex url string-parsing query-parameters


【解决方案1】:

这个正则表达式对我有用:url=([a-z:/.?=-]+&[a-z=]+)

另外,你可以测试一下:/http(s)?://([a-z-.?=&])+&/g

const string = '/api/rss/feeds?url=http://any-feed-url.com?filter=hot&format=rss&url=http://any-feed-url.com?filter=latest&format=rss'

const string2 = '/api/rss/feeds?url=http://any-feed-url.com?filter=hot&format=rss&next=parm&url=http://any-feed-url.com?filter=latest&format=rss'

const regex = /url=([a-z:/.?=-]+&[a-z=]+)/g;
const regex2 = /http(s)?:\/\/([a-z-.?=&])+&/g;

console.log(string.match(regex))
console.log(string2.match(regex2))

【讨论】:

  • 嗨,Kordrad,谢谢。它有效,但您知道如何在结果中省略 url= 吗?当然,我可以做一个字符串替换。但是是否存在某种方式来使用类似的正则表达式忽略它?
  • [^url]+ 可能不符合您的预期。 ((?!url=).)+,也许吧?
  • 试试这个:/http(s)?://([a-z-.?=&])+&/g,从http文本开始搜索你的值
【解决方案2】:

您是否尝试过使用split 方法?而不是使用正则表达式。

const urlsArr = "/api/rss/feeds?url=http://any-feed-url-a.com?filter=hot&format=rss&url=http://any-feed-url-b.com?filter=rising&format=rss".split("url=");
    urlsArr.shift(); // removing first item from array -> "/api/rss/feeds?"
console.log(urlsArr)

)

这将返回 ["/api/rss/feeds?", "http://any-feed-url-a.com?filter=hot&format=rss&", "http://any-feed-url-b.com?filter=rising&format=rss"] 然后我将删除数组中的第一项

如果可能的话最好使用其他东西然后正则表达式CoddingHorror: regular-expressions-now-you-have-two-problems

【讨论】:

    【解决方案3】:

    你可以匹配所有的url,然后将捕获组1映射到一个数组。

    str = '/api/rss/feeds?url=http://any-feed-url-a.com?filter=hot&format=rss&url=http://any-feed-url-b.com?filter=rising&format=rss'
    
    arr = [...str.matchAll(/url=(.*?)(?=&url=|$)/g)].map(x => x[1])
    
    console.log(arr)

    但旧版浏览器不支持matchAll
    但是循环 exec 来填充数组也可以。

    str = '/api/rss/feeds?url=http://any-feed-url-a.com?filter=hot&format=rss&url=http://any-feed-url-b.com?filter=rising&format=rss'
    
    re = /url=(.*?)(?=&url=|$)/g;
    arr = [];
    while (m = re.exec(str)) { 
    arr.push(m[1]);
    }
    
    console.log(arr)

    【讨论】:

      【解决方案4】:

      如果您的输入在现实中比问题中显示的格式更好,并且您的目标是现代 JavaScript 环境,那么URL/URLSearchParams

      const input = '/api/rss/feeds?url=http://any-feed-url-a.com?filter=hot%26format=rss&url=http://any-feed-url-b.com?filter=rising%26format=rss';
      const url = new URL(input, 'http://example.com/');
      
      console.log(url.searchParams.getAll('url'));

      注意& 必须转义为%26 才有意义。

      如果没有这种标准形式的输入,还不清楚哪些 URL 规则仍在讨论中。

      【讨论】:

      • 您没有使用有问题的字符串,即/api/rss/feeds?url=http://any-feed-url-a.com?filter=hot&format=rss&url=http://any-feed-url-b.com?filter=rising&format=rss,所以这个答案对OP没有帮助。
      • @WiktorStribiżew:你不知道这对 OP 没有帮助。
      • 不能,因为您没有回答当前问题。
      • @WiktorStribiżew:不正确,抱歉。
      • 如果这有帮助,则无需复制现有的解决方案。该问题将与How can I get query string values in JavaScript? 重复
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2016-04-29
      相关资源
      最近更新 更多