2013-02-05 52 views
0

這是一個簡單的問題,但我浪費太多時間試圖自己弄清楚。php遞歸正則表達式

我把數據存儲在模式爲r{N}-{N}s{N}的字符串中,其中{N}是一位或兩位數字。這種模式可以重複5次。我需要從模式中提取數字,最好以某種方式分組。

例如,如果字符串爲"r4-10s5",我想提取{4,10,5}

在字符串"r4-10s5r6-7s8"我想提取{4,10,5} {6,7,8}

如何我能得到這個在PHP中呢?

我試過使用遞歸正則表達式,但我無法讓它們正確匹配。

+0

我沒有投票給你。但事情發生的原因是你沒有提供任何實際嘗試自己的解決方案的證據,你只是要求別人爲你做你的[家]工作。 – sweaver2112

回答

1
$str = "r4-10s5r6-7s8"; 

preg_match_all("#r(\d{1,2})-(\d{1,2})s(\d{1,2})#", $str, $matches); 

// group the matches together 
$sets = array(); 
for ($i = 0, $count = count($matches[0]); $i < $count; $i++) 
    $sets[] = array($matches[1][$i], $matches[2][$i], $matches[3][$i]); 

print_r($sets); 

輸出:

array (size=2) 
    0 => 
    array (size=3) 
     0 => string '4' (length=1) 
     1 => string '10' (length=2) 
     2 => string '5' (length=1) 
    1 => 
    array (size=3) 
     0 => string '6' (length=1) 
     1 => string '7' (length=1) 
     2 => string '8' (length=1) 

不具有循環另一種選擇是:

preg_match_all("#r(\d{1,2})-(\d{1,2})s(\d{1,2})#", $str, $matches, PREG_SET_ORDER); 

print_r($matches); 

輸出:

array (size=2) 
    0 => 
    array (size=4) 
     0 => string 'r4-10s5' (length=7) 
     1 => string '4' (length=1) 
     2 => string '10' (length=2) 
     3 => string '5' (length=1) 
    1 => 
    array (size=4) 
     0 => string 'r6-7s8' (length=6) 
     1 => string '6' (length=1) 
     2 => string '7' (length=1) 
     3 => string '8' (length=1) 
+0

+1賓果。謝謝。 –

+0

有沒有直接的方式來實現這個分組沒有循環數組? –

+1

是的,將'PREG_SET_ORDER'添加到preg_match_all調用中。我編輯了我的答案。 – Supericy

1

靜態模式是:ř - 小號和空斑可以是隻有數字

/r(\d{1,2})-(\d{1,2})s(\d{1,2})/ =>測試這裏:在一排

http://regex101.com/r/sH4sY0

\d{1,2}比賽1或2個位數

-1

這是我會怎麼做:

function extractNumbers($string, $multiples = 3, $strict = false) { 
    $string = preg_replace('/\D+/', ' ', trim($string)); 
    $array = explode(' ', trim($string)); 
    $count = count($array); 
    $remove = ($count % $multiples); 
    if ($remove > 0) { 
     // Strict, do not allow dangling numbers 
     if ($strict) { 
      return null; 
     } 
     $array = array_slice($array, 0, ($count - $remove)); 
    } 
    $array = array_map('intval', $array); 
    return array_chunk($array, $multiples); 
} 
$str = 'r4-10s5r6-7s8'; 
var_dump(extractNumbers($str)); 

它可能不是很優雅,但我t比較容易理解和維護。