2017-08-18 149 views
0

有人請給我一個手。爲什麼我收到下面的輸出簡單的正則表達式模式

$pattern = "#([a-z])*|(chol)#"; 
preg_match($pattern, 'chol',$m); 

print_r($m) // array 
       (
        [0]=> 'chol', 
        [1]=> 'l' 
       ) 

爲什麼第一個匹配的子捕獲只有l字符,而全場比賽是chol。可能是我錯過了一些東西。 我期待下面

array 
     (
     [0]=> 'chol', 
     [1]=> 'chol' 
     ) 

這個輸出,我不認爲該模式過於複雜迷惑我。

+0

我想你想在'preg_replace_callback'中進一步處理結果。請參閱下面的答案,它解釋了爲什麼您需要量化組內原子而不是組本身,並且交替的順序很重要。 –

回答

3

您量化了一個組。您需要量化字符類別[a-z]

使用

$pattern = "#([a-z]*)|(chol)#"; 

看到Repeating a Capturing Group vs. Capturing a Repeated GroupPHP demo和更多的細節。簡而言之:([a-z]*)將匹配0個或更多小寫ASCII字母並將其捕獲到組1中,它將包含這些字母的整個塊,而([a-z])*將匹配並捕獲0個或多個出現的小寫ASCII字母,同時覆蓋每個先前的事件一個新的。

如果您不使用冗餘捕獲組,則可以考慮刪除冗餘捕獲組。

更多,因爲這是一個unanchored交替,請注意,[a-z]*將永遠匹配chol和第二個選擇將永遠不會匹配。您可能會考慮將(chol)作爲第一個備選,因爲它是更具體的

所以,我建議

$pattern = "#(chol)|([a-z]*)#"; 

更多關於這在Remember That The Regex Engine Is Eager

+0

這是正確的答案。 – catbadger

+1

這是否解釋了這種行爲? –

+0

@CholthiPaulTtiopic是的,它的確如此。 –