2012-03-30 65 views
1

我在下面的格式分割字符串分隔符不屬於內部特定字符

,"value","value2","3",("this is, a test"), "3" 

我如何拆分逗號的時候都沒有括號內的字符串?

編輯:對不起小問題/校正,括號內的格式實際上

,"value","value2","3",(THIS IS THE FORMAT "AND QUOTES, INSIDE"), "3" 
+0

我不能回答你的問題,但我知道用正則表達式會是一個受傷的世界。 – CanSpice 2012-03-30 17:54:58

+0

匹配所有引用的字符串是否足夠? – Gumbo 2012-03-30 17:56:17

+0

Gumbo不幸的是沒有,因爲可能有引號中的轉義報價 – user391986 2012-03-30 18:14:43

回答

2

考慮以下代碼:

$str = ',"value","value2","3",(THIS IS THE FORMAT \) "AND QUOTES, INSIDE"), "3"'; 
$regex = '#(\(.*?(?<!\\\)\))\s*,|,#'; 
$arr = preg_split($regex, $str, 0, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); 
print_r($arr); 

OUTPUT:

Array 
(
    [0] => "value" 
    [1] => "value2" 
    [2] => "3" 
    [3] => (THIS IS THE FORMAT \) "AND QUOTES, INSIDE") 
    [4] => "3" 
) 
1
preg_match("/,?\"(.*?)\",?/", $myString, $result); 

是可以檢查正則表達式here

編輯:唯一的解決方案,我可以迅速地想與逃脫報價只是替換它們,並稍後再添加它們

preg_match("/,?\"(.*?)\",?/", str_replace('\"', "'", $myString), $result); 
+0

這不幸的是不能用於報價中的轉義報價,OP在他們的問題的評論中陳述說可能存在。 http://rubular.com/r/jVe0ptri8m – CanSpice 2012-03-30 18:19:40

2

引號已經足以劃分逗號,所以你也不需要parens。如果你去掉了parens,str_getcsv()就可以工作了。如果你沒有源的控制,你可以自己帶他們:

$str = str_replace('",("', '","', $str); 
$str = str_replace('"), "', '", "', $str); 
print_r(str_getcsv($str)) 

編輯更新的問題:

你還行,只要有文件中沒有轉義括號。只是轉換接近括號開括號(因爲getcsv()只能用於分隔符的字符),然後使用開放括號爲您的引號字符:

$str = str_replace(')', '(', $str); 
print_r(str_getcsv($str, ',', '(')); 

結果:

Array 
(
    [0] => 
    [1] => "value" 
    [2] => "value2" 
    [3] => "3" 
    [4] => THIS IS THE FORMAT "AND QUOTES, INSIDE" 
    [5] => "3" 
) 
+0

嗨,亞歷克斯,對不起,我忽略了格式的一個重要細節。括號內的引號可以在裏面,但不必在開頭和結尾之後開始。 – user391986 2012-03-30 19:29:43

+0

那真是愚蠢。請打電話給負責人。 – 2012-03-30 19:56:48

+0

更新的答案爲您的額外細節。 – 2012-03-30 20:16:41

2

以上解決方案的工作很好,但我有一個更

preg_match_all('@(,)?("|(\())(.+?)((?(3)\)|"))(,)[email protected]',$str,$arr); 

輸出到這個人是

編曲AY ( [0] =>數組 ( [0] =>, 「值」, [1] => 「VALUE2」, [2] => 「3」, [3] =>( 「這是,測試」), [4] => 「3」 )

[1] => Array 
    (
     [0] => , 
     [1] => 
     [2] => 
     [3] => 
     [4] => 
    ) 

[2] => Array 
    (
     [0] => " 
     [1] => " 
     [2] => " 
     [3] => (
     [4] => " 
    ) 

[3] => Array 
    (
     [0] => 
     [1] => 
     [2] => 
     [3] => (
     [4] => 
    ) 

[4] => Array 
    (
     [0] => value 
     [1] => value2 
     [2] => 3 
     [3] => "this is, a test" 
     [4] => 3 
    ) 

[5] => Array 
    (
     [0] => " 
     [1] => " 
     [2] => " 
     [3] =>) 
     [4] => " 
    ) 

[6] => Array 
    (
     [0] => , 
     [1] => , 
     [2] => , 
     [3] => , 
     [4] => 
    ) 

所以$ ARR [4]包含匹配

2

這裏有一個簡單的標記生成器,你可以用它來拆分輸入字符串和其他字符:如果你想解析輸入

preg_match_all('/"(?:[^\\\\"]|\\.)*"|[^"]/', $input, $tokens) 

,只是迭代令牌並做任何你想要的語法檢查。您可以通過標記開頭和結尾的引號來標識字符串。