PHP Regex没有按预期工作

时间:2016-11-17 08:04:40

标签: php regex

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

$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 个答案:

答案 0 :(得分:2)

您可以使用

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

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

请参阅this PHP demoregex demo。您面临的问题是设计正则表达式重复捕获组行为,只有最后一次迭代捕获的值存储在组内存缓冲区中。

模式详情

  • (?<=/) - positive lookbehind检查左侧是否有/,如果是,请继续匹配...
  • plugins/ - 文字plugins/子字符串
  • ([^/]+) - 第1组:除/以外的一个或多个(由于+ quantifier)字符([^/]negated character class匹配任何字符但是在课堂上定义的那个。