PHP正则表达式不按预期工作

3

我有一个文件的路径,想用正则表达式提取其中的部分。但是模式似乎是错误的,只给出了最后一个匹配。

$s = 'engine/plugins/renderer_smarty/plugins/css_minify/';
preg_match('@^engine/(plugins/(.+?)/)+$@i',$s,$matches);

结果:

array (3):
    0 => string (50): "engine/plugins/renderer_smarty/plugins/css_minify/"
    1 => string (19): "plugins/css_minify/"
    2 => string (10): "css_minify"

期望结果:

array (5):
    0 => string (50): "engine/plugins/renderer_smarty/plugins/css_minify/"
    1 => string (24): "plugins/renderer_smarty/"
    2 => string (15): "renderer_smarty"
    3 => string (19): "plugins/css_minify/"
    4 => string (10): "css_minify"

模式有什么问题?
谢谢!

1
仅使用preg_match_all('@(?<=/)plugins/([^/]+)@i',$s,$matches);如何?**请参见此演示**。您面临的问题是由设计正则表达式重复捕获组行为引起的,只有最后一次迭代捕获的值存储在组内存缓冲区中。 - Wiktor Stribiżew
非常感谢,那就是解决方案!我不知道只有最后一次迭代被存储。 - Volker Heiselmayer
1个回答

2

You may use

preg_match_all('@(?<=/)plugins/([^/]+)@i',$s,$matches);

为了匹配所有你需要的子字符串,请参考此PHP演示正则表达式演示。你面临的问题是由于设计上的正则表达式重复捕获组行为,只有最后一次迭代捕获的值才会存储在组内存缓冲区中。

模式细节

  • (?<=/) - 正向回顾后查找检查左侧是否有/,如果有,则继续匹配...
  • plugins/ - 字面意思是plugins/子字符串
  • ([^/]+) - 第1组:一个或多个(由于+量词)字符不包括/[^/]是一个否定字符类,匹配除定义在类中的字符之外的任何字符)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接