【问题标题】:Parsing URL Query Parameters using regex使用正则表达式解析 URL 查询参数
【发布时间】:2016-11-05 05:06:13
【问题描述】:

我想使用正则表达式智能地解析 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。有点困惑。

谢谢!

【问题讨论】:

  • 用javascript标签添加
  • 您期望的替换输出是什么?
  • 我希望 $0 和 $1 输出 'test1' 和 'test3' 它实际上可能是一个 javascript 限制:stackoverflow.com/questions/3537878/…
  • 您正在寻找那些捕获组,但这个正则表达式只匹配一次。我仍然不明白您对该操作的预期输出是什么。您想将参数 1 和 3 中的值提取到像 ['test1', 'test3'] 这样的数组中,还是要替换它们?是否要替换整个字符串?
  • Javascript replace 将仅用回调的返回值替换匹配的文本。该捕获组未定义,因为您仅访问该交替组的最终重复。 tl;博士 - 我看不到这个正则表达式以它的编写方式解决任何现实世界的问题。您必须向我们提供任何有意义的帮助的预期输出:)。

标签: javascript regex url query-parameters


【解决方案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号。

【讨论】:

    【解决方案2】:

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

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

    Demo on Regex101

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

    对于希望获取的每个参数,您都需要额外的前瞻,而且没有办法解决这个问题。因为阳光下的每个正则表达式都是 state machine 在引擎盖下,所以您唯一要坚持使用原始模式的是给定捕获组的最新匹配。

    【讨论】:

      猜你喜欢
      • 2012-11-30
      • 2012-08-23
      • 2011-10-01
      • 1970-01-01
      • 2011-03-20
      • 2015-11-28
      相关资源
      最近更新 更多