PHP-与多种条件的PreG匹配



我有以下字符串:

"#(admin/pages|admin/pages/add|admin/pages/[0-9]+)#"

和此字符串将其比较:

"admin/pages/1"

使用preg_match()比较2个字符串时,我需要返回" admin/pages/1"。我有以下代码,它行不通:

if(preg_match("#(admin/pages|admin/pages/add|admin/pages/[0-9]+)#", "admin/pages/1", $matches) {
   var_dump($matches); 
}

这是我得到的输出:

array(2) { [0]=> string(11) "admin/pages" [1]=> string(11) "admin/pages" }

任何人都可以帮助吗?

使用以下简短的正则parrent:

"#admin/pages(/add|/[0-9]+)?#"

(/add|/[0-9]+)?-可选的替代组,如果发生在搜索的子字符串结束时匹配/add/<number>

"#(admin/pages(?:/d+)?|admin/pages/add)#"

如果将数字放在第一个模式并使它们可选的情况下,则不需要两个变体(admin/pages|admin/pages/[0+9]+(。

问号和重复默认情况下是贪婪的,这就是为什么它将始终在我的版本中包含数字。
另一方面,如果您有交替,它将始终选择第一场比赛。由于您的第一个交替不包括数字,因此不匹配。

如果您也想知道为什么要两次获得比赛,那是因为preg_match的工作方式。
文档的报价:

$匹配[0]将包含与完整模式相匹配的文本, $匹配[1]将具有与第一个捕获的文本相匹配的文字 括号的子图案等等。

如果整个匹配都足够,则可以删除外括号:

"#admin/pages(?:/d+)?|admin/pages/add#"

只需使用$matches[0]即可。

,正如@RomanPerekhrest所写的那样,我在这个答案中毫无耻辱,您可以缩短图案。您无需多次包含admin/pages

"#admin/pages(?:/add|/d+)?#"

尝试更改组件的顺序:

"#(admin/pages/[0-9]+|admin/pages/add|admin/pages)#"

一旦匹配,正则表达式就会满足。在您的情况下,它一旦找到admin/pages就停止了,而无需进一步寻找。

最新更新