Php 非捕获组:删除第三个值

Php 非捕获组:删除第三个值,php,regex,Php,Regex,我试图为其他参数构造一个正则表达式 我的URL可以具有以下值: 有效:domain.tld/app/{$ID}-{$URL\u-FRIENDLY\u-NAME} 有效:domain.tld/app/{$ID}-{$URL\u-FRIENDLY\u-NAME}/{$ACTION} 问题:domain.tld/app/{$ID}-{$URL\u-FRIENDLY\u-NAME}/{$ACTION}/{$TAB} 这是我的正则表达式: “^/app/([0-9]+)-([a-zA-Z0-9-]+|

我试图为其他参数构造一个正则表达式

我的URL可以具有以下值:

  • 有效:domain.tld/app/
    {$ID}
    -
    {$URL\u-FRIENDLY\u-NAME}
  • 有效:domain.tld/app/
    {$ID}
    -
    {$URL\u-FRIENDLY\u-NAME}
    /
    {$ACTION}
  • 问题:domain.tld/app/
    {$ID}
    -
    {$URL\u-FRIENDLY\u-NAME}
    /
    {$ACTION}
    /
    {$TAB}
这是我的正则表达式:

“^/app/([0-9]+)-([a-zA-Z0-9-]+|新)(?:/(删除|配置(?:/(信息| ftp |日志))?)”$

{$ACTION}
{$TAB}
是可选参数

对于示例,此方案有效

Full match `/app/1-testname/config`
Group 1.    `1`
Group 2.    `testname`
Group 3.    `config

Full match `/app/1-testname/delete`
Group 1.    `1`
Group 2.    `testname`
Group 3.    `delete`
  • domain.tld/app/1-testname
    • 它将打开应用程序的主视图
  • domain.tld/app/1-testname/delete
    • 当您要删除应用程序时
  • domain.tld/app/1-testname/config
    • 应用程序的配置页面
另外,我想在我的
config
-页面上创建子页面:

  • domain.tld/app/1-testname/config/info
    • 配置信息
  • domain.tld/app/1-testname/config/logs
    • 应用程序的日志文件
  • domain.tld/app/1-testname/config/ftp
    • FTP配置
我的问题是最后一个非捕获组
(?:/(info | ftp | logs))?
-匹配结果正确,但不是来自前一个非捕获组

没有最后一组,结果如下,这是正确的:

Full match `/app/1-testname/config`
Group 1.    `1`
Group 2.    `testname`
Group 3.    `config

Full match `/app/1-testname/delete`
Group 1.    `1`
Group 2.    `testname`
Group 3.    `delete`
以下是最后一个未捕获组的结果:

Full match `/app/1-testname/config/logs`
Group 1.    `1`
Group 2.    `testname`
Group 3.    `config/logs`
Group 4.    `logs`
在这里,您可以看到我的问题:
group3
的值为
group4


我的具体问题是:我如何删除
第三组的
/logs
你只需要重新安排你的分组,比如
^/app/([0-9]+)-([a-zA-Z0-9-]+|新建)(?:/(?:(删除配置)(?:/(信息| ftp |日志)))?$/code>。这将使您的组3成为非捕获组,并仅显式捕获
delete | config


站点说明:在
[a-zA-Z0-9-]+|new
中,替代方案是毫无意义的,因为
new
已经与重复字符类匹配。

您只需重新安排分组,就像
^/app/([0-9]+)-([a-zA-Z0-9-]+| new)(?:/(?:(?:(?:(删除|配置)(?:/(信息| ftp |日志))?)-)
。这将使您的组3成为非捕获组,并仅显式捕获
delete | config


站点说明:在
[a-zA-Z0-9-]+|new
中,替代方案是没有意义的,因为
new
已与重复字符类匹配。

请尝试此regexp:

^\/app\/([0-9]+)-([a-zA-Z0-9-]+|new)(?:\/(delete|config)(?:\/(info|ftp|logs))?)?$

请尝试此regexp:

^\/app\/([0-9]+)-([a-zA-Z0-9-]+|new)(?:\/(delete|config)(?:\/(info|ftp|logs))?)?$

谢谢,重新安排工作的:)是的,
新的
-关键字放错了地方;
new
必须添加到
{$ID}
-昨天添加了URL友好名称,但忘记将
new
移动到我的ID。谢谢,重新排列工作的:)是的,
new
-关键字放错了位置;
new
必须添加到
{$ID}
-昨天添加了URL友好名称,但忘记将
new
移动到我的ID。