我在下面的格式分割字符串分隔符不屬於內部特定字符
,"value","value2","3",("this is, a test"), "3"
我如何拆分逗號的時候都沒有括號內的字符串?
編輯:對不起小問題/校正,括號內的格式實際上
,"value","value2","3",(THIS IS THE FORMAT "AND QUOTES, INSIDE"), "3"
我在下面的格式分割字符串分隔符不屬於內部特定字符
,"value","value2","3",("this is, a test"), "3"
我如何拆分逗號的時候都沒有括號內的字符串?
編輯:對不起小問題/校正,括號內的格式實際上
,"value","value2","3",(THIS IS THE FORMAT "AND QUOTES, INSIDE"), "3"
考慮以下代碼:
$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"
)
引號已經足以劃分逗號,所以你也不需要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"
)
嗨,亞歷克斯,對不起,我忽略了格式的一個重要細節。括號內的引號可以在裏面,但不必在開頭和結尾之後開始。 – user391986 2012-03-30 19:29:43
那真是愚蠢。請打電話給負責人。 – 2012-03-30 19:56:48
更新的答案爲您的額外細節。 – 2012-03-30 20:16:41
以上解決方案的工作很好,但我有一個更
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]包含匹配
這裏有一個簡單的標記生成器,你可以用它來拆分輸入字符串和其他字符:如果你想解析輸入
preg_match_all('/"(?:[^\\\\"]|\\.)*"|[^"]/', $input, $tokens)
,只是迭代令牌並做任何你想要的語法檢查。您可以通過標記開頭和結尾的引號來標識字符串。
我不能回答你的問題,但我知道用正則表達式會是一個受傷的世界。 – CanSpice 2012-03-30 17:54:58
匹配所有引用的字符串是否足夠? – Gumbo 2012-03-30 17:56:17
Gumbo不幸的是沒有,因爲可能有引號中的轉義報價 – user391986 2012-03-30 18:14:43