2012-08-30 43 views
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"] 

在上面的代码像上面的UBB标签相匹配,但只返回最后一个属性,当它应该返回全部按子模式在我的正则表达式。这是怎么回事?preg_match_all不返回所有子模式

+0

当你做一个捕获组量词如:在'()+'上面,只有最后一次迭代被捕获(在你的情况下是'src'属性)。基本上你是[重复捕捉组而不是捕捉重复组](http://www.regular-expressions.info/captureall.html) – Kash

回答

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 
) 
+0

谢谢杰克!欣赏答案 – Chris