使用正则表达式解析URL查询参数

时间:2016-11-05 05:06:14

标签: javascript regex url query-parameters

我想使用正则表达式智能地解析url查询参数。

我必须考虑的事情: 1)参数可能会出错 2)只有某些参数必须匹配

给出一个查询字符串:“?param1 = test1& param2 = test2& parm3 = test3” 我想运行javascript正则表达式来解析param1的值和param3的值。

到目前为止我提出的正则表达式是:

/(?:[?&](?:param1=([^&]*)|param3=([^&]*)|[^&]*))+$/g

https://regex101.com/这样的网站中,这个正则表达式似乎对我很好。

然而,当我运行下面的JS方法时,我总是得到$ 2的未定义,这是param1的值应该解析为。有任何帮助或建议吗?

"?param1=test1&param2=test2&param3=test3".replace(
/(?:[?&](?:param1=([^&]*)|param3=([^&]*)|[^&]*))+$/g,
 function ($0, $1, $2, $3) { return $0 + ' ' + $1 + ' ' + $2 + ' ' + $3; });

这将返回$ 2作为未定义,$ 3作为test3。但是,如果我从url查询字符串中排除param2和param3,我就能成功地将param1解析为$ 2。对此有点困惑。

谢谢!

2 个答案:

答案 0 :(得分:1)

.*parameterName=([^&|\n|\t\s]+)

使用此模式将为您提供一组参数值。 例如,此URL: https://www.youtube.com/watch?v=aiYpDDHKy18&list=RDaiYpDDHKy18&start_radio=1

.*list=([^&|\n|\t\s]+)

将为您提供: 列表ID:“ RDaiYpDDHKy18”

.*start_radio=([^&|\n|\t\s]+)

将为您得到1。

答案 1 :(得分:0)

如果它们处于任意顺序,您可以使用lookaheads查找它们并捕获参数值。您想要的模式(对于您的测试字符串)是:

^(?=.*param1=([^&]+)|)(?=.*param2=([^&]+)|)(?=.*param3=([^&]+)|).+$

Demo on Regex101

它还接受缺少参数的查询字符串,因为每个前瞻在参数/值对或空字符串上交替使用最后的|

您希望获得的每个参数都需要额外的前瞻,而且无法解决这个问题。因为太阳下的每一个正则表达式都是state machine,所以你唯一要坚持使用原始模式就是给定捕获组的最新匹配。