2013-05-10 86 views
1

我有一個字符串,如下所示(示例中的字母可以是數字或文本,可以是大寫或小寫,也可以是兩者)如果值是句子,則應該在單引號):使用正則表達式對字符串進行爆炸

$string="a,b,c,(d,e,f),g,'h, i j.',k"; 

我該如何爆炸以獲得以下結果?

Array([0]=>"a",[1]=>"b",[2]=>"c",[3]=>"(d,e,f)",[4]=>"g",[5]=>"'h,i j'",[6]=>"k") 

我認爲使用正則表達式將是一個快速以及乾淨的解決方案。任何想法?

編輯: 這是我迄今所做的,這是有括號之間的長期部分字符串很慢:

$separator="*"; // whatever which is not used in the string 
$Pattern="'[^,]([^']+),([^']+)[^,]'"; 
while(ereg($Pattern,$String,$Regs)){ 
    $String=ereg_replace($Pattern,"'\\1$separator\\2'",$String); 
} 

$Pattern="\(([^(^']+),([^)^']+)\)"; 
while(ereg($Pattern,$String,$Regs)){ 
    $String=ereg_replace($Pattern,"(\\1$separator\\2)",$String); 
} 

return $String; 

這將替換所有括號之間的逗號。然後我可以用逗號分解它,並用原來的逗號代替$separator

+0

你試過爆炸()函數? ref - http://php.net/manual/en/function.explode.php – 2013-05-10 06:56:07

+0

到目前爲止你嘗試了什麼?你的實際問題是什麼(除了要讓別人爲你做)。 – 2013-05-10 06:57:05

+0

請準確描述輸入字符串的外觀。它總是隻是',並且('?是必需的值總是小寫字母,並且只有其中的一個? – dognose 2013-05-10 07:31:58

回答

4

可以使用preg_match_all做的工作

$string="a,b,c,(d,e,f),g,'h, i j.',k"; 

preg_match_all('~\'[^\']++\'|\([^)]++\)|[^,]++~', $string,$result); 
print_r($result[0]); 

說明:

訣竅是,如果你有一個以上的分隔符像的,

~   Pattern delimiter 
' 
[^']  All charaters but not a single quote 
++   one or more time in [possessive][1] mode 
' 
|   or 
\([^)]++\) the same with parenthesis 
|   or 
[^,]  All characters but not a comma 
++ 
~ 

之前匹配括號引號(開放和關閉是相同的),您可以使用capture gro來編寫您的模式達:

$string="a,b,c,(d,e,f),g,'h, i j.',k,°l,m°,#o,p#,@q,[email protected],s"; 

preg_match_all('~([\'#@°]).*?\1|\([^)]++\)|[^,]++~', $string,$result); 
print_r($result[0]); 

解釋:

(['#@°]) one character in the class is captured in group 1 
.*?  any character zero or more time in lazy mode 
\1   group 1 content 

對於嵌套的括號:

$string="a,b,(c,(d,(e),f),t),g,'h, i j.',k,°l,m°,#o,p#,@q,[email protected],s"; 

preg_match_all('~([\'#@°]).*?\1|(\((?>[^()]++|(?-1)?)*\))|[^,]++~', $string,$result); 
print_r($result[0]); 
+0

謝謝,我會試試這個,讓你知道這是如何工作在我的真實情況下,還有一件事,我增加了更多描述到這個問題,不知道它是如何影響你的解決方案的。 – SAVAFA 2013-05-10 10:56:47

+0

@SaVaFa:你可以用單引號做同樣的事情,看看更新。 – 2013-05-10 12:08:29

+0

@CasimiretHippolyte:它工作正常,我認爲它是解決方案,只是我注意,它給嵌套圓括號帶來了問題,比如(,(,))...但是它對於給定的問題是有效的+1 – 2013-05-10 12:29:14