2011-11-14 100 views
0

我想弄清楚在WordPress插件的機制。 我有一個preg_match_all功能,看起來像這樣:從preg_match_all迭代匹配

preg_match_all('/(?<=\\[\\[).+?(?=\\]\\])/', $content, $matches, PREG_PATTERN_ORDER); 
$numMatches = count($matches[0]); 

for ($i = 0; $i < $numMatches; $i++) { 
    $postSlug = $matches[0][$i]; 
} 

如果我理解正確此,count($matches[0])假定只有一個在$content比賽。

我的目標是重新編寫for語句以允許preg_match_all腳本中的所有匹配項。

我假設我應該用foreach ($matches as $postSlug)來代替for語句,最後甚至不會打擾令人困惑的$matches[0][$i]

不幸的是,最終的輸出似乎沒有循環遍歷數組中的每個元素。有任何想法嗎?謝謝!

回答

2

如果我理解這個正確,計數($比賽[0]假設僅存在一個匹配在$內容

不太; $matches[0]表示比賽的整個正則表達式的陣列(與$matches[1]相反,這將是正則表達式的第一個匹配組中的匹配數組)。因此,count($matches[0])是他在第一個匹配組中的匹配數。已經說過並且將for循環改寫爲foreach循環,但這可能不會改變任何內容,因爲這兩種方法都應該遍歷$matches[0]中的所有元素。你確定你正在尋找的結果是否與你的正則表達式匹配?

+0

您是對的。 $ matches [0]引用整個表達式中的匹配數組。我能夠成功地遍歷數組。謝謝。 – AlxVallejo

1

如果您確實想要重寫此代碼,那麼我建議您查看PREG_SET_ORDER作爲最後一個參數,而不是PREG_PATTERN_ORDER。這首先按結果對結果數組進行分組,然後對第二級中的匹配組進行分組。

然後,你可以在它循環如下:

foreach ($matches as $matchgroup) { 
    $postslug = $matchgroup[0]; 
} 

你仍然需要[0]獲得「完全匹配」。如果您的模式有任何(..)組,那麼[1][2]將對應於那些..