繁体   English   中英

PHP regex - 多组捕获的奇怪问题

[英]PHP regex - weird issue with multiple group capture

编码:

$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>以及如何修复它?

PS 我在https://www.regex101.com上尝试了这个正则表达式,它在那里正确捕获,但在我的机器上使用 PHP7,它没有。 我觉得 regex101 过滤输出。

正如其他人所说,这就是正则表达式的工作原理。 据我所知,它对正则表达式相当普遍。 它甚至在一般的编程中也有相似之处,例如 Java 如何需要一个String返回函数来返回一个String (除非它抛出错误)。

在 PHP 中,在$matches上使用array_filter来删除空条目。

另外,我建议使用非捕获组(?:)来减少混乱:

(?:/(?P<lang>en|ru))?/foo(?:/(?P<bar>bar))?

或者将其拆分为 2 个正则表达式: (?:/(?P<lang>en|ru))/foo(?:/(?P<bar>bar))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM