preg_match_all不返回所有子模式

时间:2012-08-30 01:33:54

标签: php regex bbcode

$pattern = '#\[img (([^="\]]+)="([^"]+)" ?)+\]#';
preg_match_all($pattern,$blog,$matches,PREG_PATTERN_ORDER);
[img size="preview" click="http://text.com" align="right" src="pic:3378f.jpg"]

顶部的代码与上面的BBCode标签匹配,但只返回最后一个属性,它应该根据我的正则表达式中的子模式返回所有属性。这是什么交易?

1 个答案:

答案 0 :(得分:2)

为此,您必须首先匹配[img]块:

preg_match_all('#\[img(.*?)\]#s', $blog, $matches);

你记住标签内的模式,并使用另一个循环来提取参数,使用另一个preg

foreach ($matches[1] as $img) {
    preg_match_all('#\s*([^=]+)="([^"]*)"#', $img, $matches);
    // create key-pair array
    $params = array_combine($matches[1], $matches[2]);
    print_r($params);
}

输出:

Array
(
    [size] => preview
    [click] => http://text.com
    [align] => right
    [src] => pic:3378f.jpg
)