非捕获组:删除第3个值

时间:2017-02-04 14:30:06

标签: php regex

我试图为其他参数构建正则表达式。

我的网址可以包含以下值:

  • 作品:domain.tld / app / {$ID} - {$URL_FRIENDLY_NAME}
  • 作品:domain.tld / app / {$ID} - {$URL_FRIENDLY_NAME} / {$ACTION}
  • 问题: domain.tld / app / {$ID} - {$URL_FRIENDLY_NAME} / {$ACTION} / {$TAB}

这是我的正则表达式:

  

' ^ /应用/([0-9] +) - ([A-ZA-Z0-9 - ] + |新)(:?/(删除|配置(:/(信息| FTP |?日志))))$

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

对于示例,此方案有效

  • 使用domain.tld /应用/ 1-测试名
    • 打开应用程序的主视图
  • 使用domain.tld /应用/ 1-测试名称/删除
    • 如果要删除应用
  • 使用domain.tld /应用/ 1-测试名称/配置
    • Apps的配置页面

其他我想在我的config - 页面

上创建子页面
  • 使用domain.tld /应用/ 1-测试名/配置/信息
    • 配置-信息
  • 使用domain.tld /应用/ 1-测试名/配置/日志
    • 应用程序的日志文件
  • 使用domain.tld /应用/ 1-测试名/配置/ 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`

在这里,您看到我的问题:Group 3的值为Group 4

我的具体问题是:我如何删除/logs上的Group 3

2 个答案:

答案 0 :(得分:0)

您只需稍微重新排列分组,例如^/app/([0-9]+)-([a-zA-Z0-9-]+|new)(?:/(?:(delete|config)(?:/(info|ftp|logs))?))?$。这使您的第3组无法捕获,并且只显式捕获delete|config

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

答案 1 :(得分:0)

请试试这个正则表达式:

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