PHP正则表达式匹配字符串中的组

问题描述 投票:2回答:1

我有一个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被发送,它将表格分组到服务而不匹配令牌

php regex routing
1个回答
2
投票

你可以用

'~^feedback(?:/(?P<form>[^/]*))?(?:/(?P<token>[^/]*))?~'

regex demo

如果右侧不再显示文本,请在正则表达式的末尾添加$

'~^feedback(?:/(?P<form>[^/]*))?(?:/(?P<token>[^/]*))?$~'

细节

  • ^ - 开始输入
  • feedback - 文字字符串
  • (?:/(?P<form>[^/]*))? - 一个可选的非捕获组: / - 一个/字符(不需要逃脱,因为~使用正则表达式分隔符字符) (?P<form>[^/]*) - 组“形式”:除/以外的任何0或更多字符
  • (?:/(?P<token>[^/]*))? - 一个可选的非捕获组: / - / char (?P<token>[^/]*) - 组“标记”:除了/之外的任何0或更多字符
  • $ - 输入结束。
© www.soinside.com 2019 - 2024. All rights reserved.