2
$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 标签匹配,但只返回最后一个属性,当它应该根据我的正则表达式中的子模式返回所有属性时。这是怎么回事?

4

1 回答 1

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
)
于 2012-08-30T02:08:00.743 回答