2010-09-28 148 views
2

我正在使用preg_match_all在Twitter搜索響應中搜索HashTag值。使用preg_match_all獲取空數組結果,其值不匹配

它符合我的預期,除了搜索結果中沒有任何散列值時。出於某種原因,我的$ tags數組仍然有值,我不知道爲什麼。

是因爲我的RegEx不正確,還是與preg_match_all有問題?

感謝

$tweet = "Microsoft Pivot got Runner-Up for Network Tech from The Wall Street Journal in 2010 Technology Innovation Awards http://bit.ly/9pCbTh"; 

private function getHashTags($tweet){ 
    $tags = array(); 
    preg_match_all("/(#\w+)/", $tweet, $tags); 

    return $tags; 

} 

結果:

Array ([0] => Array () [1] => Array ()) 

預期結果:

Array(); 

回答

4

在默認模式下,preg_match_all返回比賽和子匹配的數組:

PREG_PATTERN_ORDER
結果排序使得$matches[0]充滿模式匹配的陣列,$matches[1]是由匹配的字符串數組第一個加括號的子模式,等等。

所以在這種情況下,第一個數組是整個模式的匹配數組,而第二個數組是第一個子模式的匹配數組。由於沒有找到匹配,所以這兩個數組都是空的。

如果你想另外的順序,具有與它的子匹配的陣列中的每個匹配,使用PREG_SET_ORDER標誌參數:

preg_match_all("/(#\w+)/", $tweet, $tags, PREG_SET_ORDER); 
+1

感謝結果數組的解釋。這是有道理的,我現在能夠解決我的解決方案,我知道要尋找什麼。 – discorax 2010-09-28 20:38:49

1

你得到兩個空的陣列,因爲你是相匹配的表達式和子表達式。您的預期結果實際上是這裏的錯誤。檢查the manual,當沒有標記在第四個參數被傳遞默認行爲具體的描述:

結果排序使得$ [0]被滿圖案匹配的數組的匹配,$匹配1是陣列由第一個圓括號子模式匹配的字符串,等等。

除非通過PREG_OFFSET_CAPTURE作爲標誌參數,否則您總是會從preg_match_all獲取多維數組。在這種情況下,實際上應該爲不匹配任何內容的表達式獲得一個空數組。

+0

這是不正確的,你需要通過PREG_SET_ORDER – Galen 2010-09-28 19:48:41