我有以下逻辑从应用程序 URL 检索查询 PARAM。但是,当 URL 作为查询参数且具有自己的查询参数时,此逻辑不起作用。下面的例子
例如:https://test.domain.com?param1=a&ru=https://url2.domain.com/?url2paramA=A&url2paramB=B
在此示例中,url2param2 是 ru(重定向 URL)的一部分。当我尝试检索 ru 参数时,它只给出带有第一个参数的 URL 部分。第二个查询参数被视为主 URL 的一部分。
当前逻辑
const getParameterByName = (name, search) => {
const match = RegExp('[?&]' + name + '=([^&]*)').exec(search);
try {
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
} catch {
return match && match[1];
}
};
var result = getParameterByName('ru', 'https://test.domain.com?param1=a&ru=https://url2.domain.com/?url2paramA=A&url2paramB=B');
console.log(result)
这是因为您的重定向网址未编码
const getParameterByName = (name, search) => {
const match = RegExp('[?&]' + name + '=([^&]*)').exec(search);
try {
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
} catch {
return match && match[1];
}
};
const url = `https://test.domain.com/param1=a&ru=${encodeURIComponent('https://url2.domain.com/url2paramA=A&url2paramB=B')}`;
console.log(getParameterByName('ru', url))
URL
和 URLSearchParams
API:
const plainUrl = 'https://test.domain.com?param1=a&ru=https://url2.domain.com/?url2paramA=A&url2paramB=B';
const url = new URL(plainUrl);
const result = url.searchParams.get('ru');
console.log(result);
编辑:
如果您想将
paramB
视为 ru
的一部分,则必须 encodeURIComponent
第二个 URL:
const plainMainUrl = 'https://test.domain.com?param1=a';
const plainRedirectUrl = 'https://url2.domain.com/?url2paramA=A&url2paramB=B';
// option 1: manual
const plainUrl1 = `${plainMainUrl}&ru=${encodeURIComponent(plainRedirectUrl)}`;
const url1 = new URL(plainUrl1);
const result1 = url1.searchParams.get('ru');
// end option 1
// option 2: URLSearchParams#append
const url2 = new URL(plainMainUrl);
url2.searchParams.append('ru', plainRedirectUrl);
const result2 = url2.searchParams.get('ru');
// end option 2
console.assert(result1 === result2 && result2 === plainRedirectUrl);
console.log(result1);
您的代码工作完美,但在这段代码中,您使用正则表达式提取
&
之间的 url,这就是为什么您在 url2paramB=B
之后没有得到 &
的原因,但是您需要在任何特殊字符(例如您的字符)之间传递重定向 URL给定网址。
https://test.domain.com?param1=a&ru=**https://url2.domain.com/?url2paramA=A&url2paramB=B**
此 URL 包含一个特殊字符(两个星号 (
**
)),因此您可以提取这些星号之间的重定向 URL (*
)。
试试这个代码:
const getParameterByName = (name, search) => {
const match = RegExp(`${name}=\\*{2}(.*?)\\*{2}`).exec(search);
return match ? match[1] : null;
};
var result = getParameterByName('ru', 'https://test.domain.com?param1=a&ru=**https://url2.domain.com/?url2paramA=A&url2paramB=B**');
console.log(result)