考虑以下字符串
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如果存在下一个字符,则必须为/
答案 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个字符)/
- 可选的\/?
/
- 字符串结束。