我有一个PHP项目使用路由这传递url请求feedback/services/mytoken
然后有一个正则表达式,检测部件传递到脚本与此/^feedback(\/(?P<form>.*))(\/(?P<token>.*))/U
示例RegEx Test现在工作正常,但我已经意识到我会遇到一些问题当网址是feedback/service
时,它不会捡到它。
// working
$request = 'feedback/services/mytoken';
$regex = '/^feedback(\/(?P<form>.*))(\/(?P<token>.*))/U';
// returns
$returns = [
"form" => 'services',
"token" => "mytoken"
];
// not working
$request = 'feedback/services';
$regex = '/^feedback(\/(?P<form>.*))(\/(?P<token>.*))/U';
// expected returns
$returns = [
"form" => 'services'
];
我希望能够正确捕捉群体,但我不确定正确的方法。我也希望能够拿起它,如果只有部分匹配,即feedback/services
被发送,它将表格分组到服务而不匹配令牌
你可以用
'~^feedback(?:/(?P<form>[^/]*))?(?:/(?P<token>[^/]*))?~'
如果右侧不再显示文本,请在正则表达式的末尾添加$
:
'~^feedback(?:/(?P<form>[^/]*))?(?:/(?P<token>[^/]*))?$~'
细节
^
- 开始输入feedback
- 文字字符串(?:/(?P<form>[^/]*))?
- 一个可选的非捕获组:
/
- 一个/
字符(不需要逃脱,因为~
使用正则表达式分隔符字符)
(?P<form>[^/]*)
- 组“形式”:除/
以外的任何0或更多字符(?:/(?P<token>[^/]*))?
- 一个可选的非捕获组:
/
- /
char
(?P<token>[^/]*)
- 组“标记”:除了/
之外的任何0或更多字符$
- 输入结束。