【问题标题】:Regex to match specific path with specific query param正则表达式将特定路径与特定查询参数匹配
【发布时间】:2019-08-08 20:02:59
【问题描述】:

我正在努力创建正则表达式以将 URL 路径与可能位于任何位置的查询参数匹配。

例如 URL 可以是:

/page?foo=bar&target=1&test=1 <- should match
/page?target=1&test=2 <- should match
/page/nested?foo=bar&target=1&test=1 <- should NOT match
/page/nested?target=1&test=2 <- should NOT match
/another-page?foo=bar&target=1&test=1 <- should NOT match
/another-page?target=1&test=2 <- should NOT match

我需要将参数 target 专门针对 /page

此正则表达式仅用于查找参数 \A?target=[^&amp;]+&amp;*

谢谢!

更新: 第三方工具需要它来决定在哪个页面上运行实验。它只接受在他们的仪表板上进行常规 experssion 设置,因此我不能使用 URL 解析器等代码工具。

【问题讨论】:

  • \/page\?.*target=([^&]+) 它将在第 1 组中匹配 target 的内容,在本例中为“1”跨度>

标签: javascript regex url query-parameters


【解决方案1】:

一般规则是,如果要解析参数,请使用 URL 解析器,而不是自定义正则表达式。

在这种情况下,您可以使用例如:

# http://a.b/ is just added to make URL parsing work
url = new URL("http://a.b/page?foo=bar&target=1&test=1")
url.searchParams.get("target")
# => 1
url.pathname
# => '/page'

然后在 ifs 中检查这些值:

url = new URL("http://a.b/page?foo=bar&target=1&test=1")

url = new URL("http://a.b/page?foo=bar&target=1&test=1")
if (url.searchParams.get("foo") && url.pathname == '/page' {
  # ...
}

另见:

编辑

如果你必须使用正则表达式,试试这个:

\/page(?=\?).*[?&]target=[^&\s]*(&|$)

Demo

解释:

  • \/page(?=\?) - 匹配路径(从 / 开始,然后是 page,然后向前查找 ?
  • .*[?&amp;]target=[^&amp;\s]*($|&amp;) 匹配参数名称 target:
    • 位于任何地方(前面是.*
    • [?&amp;] 前面有 ?&amp;
    • 后跟它的值 (=[^&\s]*)
    • 以参数结尾 ($) 或其他参数 (&amp;) 结尾

【讨论】:

  • 需要一个工具来决定在哪个页面上运行实验。它只接受这种方式在他们的仪表板上进行设置。
  • 所以我这里没有选项
  • 更新的正则表达式将匹配 /page?foo=bar?target=1&amp;test=1 与 2 ?
  • 什么意思?不应该匹配吗?
  • @Kosmetika - 您应该编辑您的问题并使用这些 cmets 中的信息对其进行更新。 mrzasa 建议使用new URL 最自然的回答,因为您的问题没有提到阻止您这样做的限制。
【解决方案2】:

如果您正在寻找正则表达式,那么您可以使用:

/\/page\?(?:.*&)?target=[^&]*/i

RegEx Demo

正则表达式详细信息:

  • \/page\?:匹配文字/page?
  • (?:.*&amp;)?:匹配任意长度的可选文本,后跟&amp;
  • target=[^&amp;]*:匹配文本 target= 后跟 0 个或多个不是 &amp; 的字符

【讨论】:

    猜你喜欢
    • 2015-09-27
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多