2013-10-21 41 views
0

我有一個模式被匹配到一個大字符串,使用preg_match_all,它得到正確的匹配就好了,但它似乎進入每個匹配,並嘗試找到更多的匹配,然後進入其中的每一個,並在最後一個空字符串時停止。聽起來像某種遞歸,但我不需要也不想這樣,有沒有辦法阻止它?PHP:Preg_Match_All奇怪的行爲

謝謝你的幫助!

function getCategories($source) 
{ 
    $categories = array(); 

    $pattern = "~<span class=.*\n<table class=.*\n<tr>\n<th.*\n<.th>\n<th.*\n<.th>\n<th.*\n<.th>\n<th.*\n<.th>\n<th.*\n<.th>\n<th.*\n<.th><.tr>\n(<tr id=.*\n(.*\n){6}<.td><.tr>(<.table>)?\n)*~"; 

    preg_match_all($pattern, $source, $categories); 

    return $categories; 
} 

$categories = getCategories($source); 

print_r($categories); 
+2

是的,你不使用的HTML正則表達式解決它,並切換到DOM/XPath的最好的方法代替。 –

+1

什麼是醜陋的正則表達式...只是使用像[phpQuery](https://code.google.com/p/phpquery/) – HamZa

+0

我幾乎終於得到了我的代碼在某種程度上工作,我不有時間去嘗試理解新的類並重寫它,是否沒有辦法去刪除函數的這種遞歸性質? – AndrewB

回答

1

此行爲的原因是因爲有多個實例使用.*條款。

該術語可以對應任意長度的字符串,並且可以跨越多個tr標籤。您需要使用非貪婪版本.*?。這應該夠了吧。

注:至於建議,做您正試圖將解析DOM結構作爲一個DOMElement或XML

+0

我明白這不是形成我的表達的最好方式,主要是這樣做,因爲它的工作原理,我懶得寫出正確的,但即使它可以形成匹配,當它進入每場比賽,我不即使我完成了正則表達式,它仍然會創建一個滿是空字符串的第1個元素。 下次我需要從網站獲取HTML時,我會聽取建議!謝謝大家的建議。 – AndrewB

+0

我已經通過簡單地返回第0個元素(我想要的東西的數組)而不是整個數組數組來解決這個問題。它只是無視其餘的......不喜歡這樣浪費記憶,但我會處理它。我會給你明確的答案。 – AndrewB

+0

用'。*?'替換'。*'是否有效?如果沒有,請指定實際工作的內容並將其標記爲答案。 –