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=
.
提前致谢。
如果您的输入在现实中比问题中显示的格式更好,并且您的目标是现代 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)
我需要解析复杂的 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=
.
提前致谢。
如果您的输入在现实中比问题中显示的格式更好,并且您的目标是现代 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)