正则表达式匹配特定字符但是可选

时间:2018-06-01 13:58:10

标签: php regex preg-match

考虑以下字符串

home
administrator
admin
admin/
admin/users/index

preg_match("/^admin\/?(P<controller>[a-z-]+)?\/?(?P<action>[a-z-]+)?$/i", $input_line, $output_array);

它正在按预期匹配最后3个字符串,但也匹配“管理员”返回'istrator'作为“控制器”

如何使'/'成为可选项,但任何其他字符都不计算在内。我尝试过像[^a-z]\/?这样的东西,但我很茫然。有可能吗?

逻辑是; 1.匹配admin
2.下一个字符都是可选的 2.1如果存在下一个字符,则必须为/

直播示例https://www.phpliveregex.com/p/oaQ

1 个答案:

答案 0 :(得分:1)

您可以使用可选的非捕获组作为命名捕获组周围的容器,其中模式可以是强制性的:

YourObjectType

请参阅regex demo

<强>详情

  • '~^admin(?:\/(?P<controller>[a-z-]+))?(?:\/(?P<action>[a-z-]+))?\/?$~i' - 字符串开头
  • ^ - admin substring
  • admin - 一个可选的非捕获组,匹配1或0次重复
    • (?:\/(?P<controller>[a-z-]+))? - \/字符
    • / - 群组(?P<controller>[a-z-]+):1 + ASCII字母或controller(另请考虑使用-来匹配[^\/]+以外的任何1个字符)
  • / - 群组(?:\/(?P<action>[a-z-]+))?:1 + ASCII字母或action(另请考虑使用-来匹配[^\/]+以外的任何1个字符)
  • / - 可选的\/?
  • / - 字符串结束。