PHP Regex不能正常工作


PHP Regex not working as expected

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

$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"

图案出了什么问题?

谢谢!

您可以使用

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

匹配所需的所有子字符串。

查看这个PHP演示和一个正则表达式演示。您面临的问题是一个按设计的正则表达式重复捕获组行为,只有最后一次迭代捕获的值存储在组内存缓冲区中。

<<p> 模式细节/strong>:
  • (?<=/) -检查左边是否有/,如果有,继续匹配…
  • plugins/ -一个文字plugins/子字符串
  • ([^/]+) -组1:/以外的一个或多个字符(由于+量词)([^/]是一个否定的字符类,匹配任何字符,但在该类中定义的字符。