如何从将重定向 URL 作为参数之一的 URL 中检索所有查询参数

问题描述 投票:0回答:3

我有以下逻辑从应用程序 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)

javascript reactjs url query-string
3个回答
2
投票

这是因为您的重定向网址未编码

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))


1
投票

正如评论中提到的,您可以使用

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);


-1
投票

您的代码工作完美,但在这段代码中,您使用正则表达式提取

&
之间的 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)

© www.soinside.com 2019 - 2024. All rights reserved.