【发布时间】:2016-04-04 13:48:26
【问题描述】:
代码:
$pattern = '~(/(?P<lang>en|ru))?/foo(/(?P<bar>bar))?~';
preg_match($pattern, '/foo', $matches);
var_dump($matches);
/*output:
array(1) {
[0] =>
string(4) "/foo"
}*/
preg_match($pattern, '/foo/bar', $matches);
var_dump($matches);
/*output:
array(7) {
[0] =>
string(8) "/foo/bar"
[1] =>
string(0) ""
'lang' =>
string(0) ""
[2] =>
string(0) ""
[3] =>
string(4) "/bar"
'bar' =>
string(3) "bar"
[4] =>
string(3) "bar"
}*/
问题:为什么它会在第二个 preg_match 调用中捕获<lang>,我该如何解决?
附:我在https://www.regex101.com 上尝试了这个正则表达式,它在那里正确捕获,但在我的 PHP7 机器上,它没有。我感觉 regex101 过滤了输出。
【问题讨论】:
-
不知道你的意思,但也许惰性匹配会有所帮助:
(/(?P<lang>en|ru))??/foo(/(?P<bar>bar))? -
我的意思是当没有匹配时它不应该捕获
lang。这没有任何意义。不,添加另一个?并没有帮助。 -
请澄清。我在您的代码演示中看到
lang是空的:'lang' => string(0) ""。未捕获任何文本。 -
...欢迎使用 PHP :-D
-
看看regex101:如果你在选项中启用“显示非参与组”,你会在右边看到所有的组信息。默认行为只是隐藏它们。