我有以下字符串:
"#(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
就停止了,而无需进一步寻找。