Javascript 正则表达式解析复杂的 url 字符串

Javascript regex parse complex url string

我需要解析复杂的 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

提前致谢。

如果您的输入在现实中比问题中显示的格式更好,并且您的目标是现代 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 规则仍在 table。

您尝试过使用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)

)

这将是 return ["/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

这个正则表达式对我有用: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))

您可以匹配所有 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)