2012-08-30 44 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