2011-07-09 165 views
0

我得到這個正則表達式:匹配與preg_match_all

$val = "(123)(4)(56)"; 
$regex = "^(\((.*?)\))+$"; 
preg_match_all("/{$regex}/", $val, $matches); 

誰能告訴我爲什麼這個只有最後一個數字(56)匹配,而不是每一組數字分別?

這是$匹配上述正則表達式運行後包含:

array 
    0 => 
    array 
     0 => string '(123)(4)(56)' (length=12) 
    1 => 
    array 
     0 => string '(56)' (length=4) 
    2 => 
    array 
     0 => string '56' (length=2) 
+2

看到這個問題:http://stackoverflow.com/questions/6571106/can-you-retrieve-multiple-regex-matches- in-javascript –

+0

@Felix King:任何想法如何在PHP中獲取捕獲?任何機會? – hakre

+0

heh從來沒有想到PCRE這樣簡單的事情是不可能的。有什麼解決辦法嗎?我基本上試圖匹配這個:「(any_amount_of_numbers)」在一個字符串中,只要它是一個字符串包含的唯一東西,根據需要多次。 – John

回答

0

正如@develroot已經回答了你想使用preg_match_all不工作的方式,它只會返回最後一個匹配組,不所有捕獲的該組。這就是正則表達式的工作原理。在這一點上,我不知道如何在PHP中獲得所有的組策略,我認爲這是不可能的。可能是不對的,可能會改變。

但是,您可以通過首先檢查整個字符串是否匹配您的(重複)模式,然後通過該模式提取匹配來解決該問題。把它所有的一個功能中,它的方便(Demo):

$tests = explode(',', '(123)(4)(56),(56),56'); 

$result = array_map('extract_numbers', $tests); 

print_r(array_combine($tests, $result)); 

function extract_numbers($subject) { 
    $number = '\((.*?)\)'; 
    $pattern = "~^({$number})+$~"; 
    if (!preg_match($pattern, $subject)) return array(); 
    $pattern = "~{$number}~"; 
    $r = preg_match_all($pattern, $subject, $matches); 
    return $matches[1]; 
}