【问题标题】:Allow multiple URI parameters through regex通过正则表达式允许多个 URI 参数
【发布时间】:2026-01-26 13:50:02
【问题描述】:

我离我想要达到的目标已经很近了。

我有这个:

'/create-group/([A-Za-z0-9\-\_]+)(?:/([A-Za-z0-9\-\_]+))?(?:(\?|&)(groupid|copyofgroup|ref)=([A-Za-z0-9\-\_]+))?'

它允许我限制可以输入和访问的 URI,例如:

/create-group/123/456?groupid=789

在正则表达式的最后一位,我允许 3 个参数(groupid、copyofgroup 和 ref)。

这一切都很好,但我想不出办法让我的 preg_match 验证这 3 个参数中的 无限 个参数。目前,我仅限于一个参数的 1 个实例。

我希望我的 preg_match() 接受:

/create-group/123/456?groupid=789&ref=101112&copyofgroup=789

我尝试了诸如*+ 之类的乘数,但无济于事。

谢谢!

【问题讨论】:

  • 你为什么使用正则表达式而不是$_GET$_POST$_REQUEST superglobals?
  • @Nordenheim 我不确定你的意思是什么?在获取相关文件之前,此代码位于顶层。我只是想限制在 URI 中可以插入哪些参数。 $_GET superglobals 将如何帮助我?
  • [A-Za-z0-9\-\_] 替换为[[:alnum:]_-]。字符在方括号内失去了它们的特殊性,所以你不需要用反斜杠来转义,两端的破折号意味着破折号而不是范围分隔符。字符类才有意义。
  • @Justin01 标签建议您使用 PHP,这意味着您可以 $_GET URI 字符串中所需的参数并忽略其余部分,而不是费力地编写代码。

标签: php regex


【解决方案1】:

您可以在末尾添加 {0,3} 而不是“?”:

/create-group/([A-Za-z0-9-_]+)(?:/([A-Za-z0-9-_]+))?(?:(\?|& )(groupid|copyofgroup|ref)=([A-Za-z0-9-_]+)){0,3}

我在这里试过: https://regex101.com/

【讨论】:

  • 很有趣,不知道为什么我没有想到。非常感谢!
【解决方案2】:

找到解决办法:

'/create-group/([A-Za-z0-9\-\_]+)(?:/([A-Za-z0-9\-\_]+))?(?:((\?|&)(groupid|copyofgroup|ref)=([A-Za-z0-9\-\_]+))+)?'

【讨论】: