2012-07-26 109 views
2

我有一個這樣的字符串:拆分正則表達式PHP

0d(Hi)i(Hello)4d(who)i(where)540d(begin)i(began) 

,我想使其與數組。 我嘗試先添加分隔符,以便使用php函數爆炸。

;0,d(Hi),i(Hello);4,d(who),i(where);540,d(begin),i(began) 

它的工作原理,但問題是我想盡量減少分隔符以節省磁盤空間。 因此我想通過使用使preg_split,正則表達式就知道了,如果有可能有這樣的一個巨大的數組,而無需使用分離器:

Array ([0] => Array ([0] => 0 [1] => d(hi) [2] => i(Hello)) 
     [1] => Array ([0] => 4 [1] => d(who) [2] => i(where)) 
     [2] => Array ([0] => 540 [1] => d(begin) [2] => i(began)) 
     ) 

我嘗試一些代碼&正則表達式,但我看到的是,在常規的價值表達式不存在於最終結果中(如爆炸函數,在最後一個數組中,我們沒有分隔符)。

更多內容,我在構建正則表達式時遇到了一些困難。這裏是我做了一個:

$modif = preg_split("/[0-9]+(d(.+))?(i(.+))?/", $data); 

我必須精確,以至於d()和我()可以不存在(但至少一個)

感謝

+0

你的意思是'd(...)'或'我(...)'可能並不總是存在嗎?如果兩者都存在,它們總是按照這個順序嗎? – 2012-07-26 08:35:39

+0

是的。總是在我之前,但是d可以缺席,我可以缺席,但不能同時缺席。 – Dahevos 2012-07-26 08:38:26

回答

2

如果你

preg_match_all('/(\d+)(d\([^()]*\))?(i\([^()]*\))?/', $subject, $result, PREG_SET_ORDER); 

您的原始字符串,那麼你會得到一個數組,其中

$result[$i][0] 

包含第i次比賽(即,即$result[0][0]0d(Hi)i(Hello)),並且其中

$result[$i][$c] 

包含i個匹配的c個捕獲組(即$result[0][1]0$result[0][2]d(Hi)$result[0][2]i(Hello))。

這就是你想要的嗎?

+0

是的,我會試試看,謝謝! – Dahevos 2012-07-26 08:34:08