0

我有一个字符串,用户可以使用逗号手动拆分。

例如,字符串value1,value2,value3应生成数组:

["value1", "value2", "value3"]

现在如果用户希望允许逗号作为子字符串怎么办?我想通过让用户使用两个逗号或反斜杠来转义逗号来解决这个问题。例如,字符串

“Hi, Stackoverflow”将被写成“Hi,, Stackoverflow”或“Hi\, Stackoverflow”。

但是,我发现很难评估这样的字符串。我尝试过 preg 拆分,但无法查看后向或前瞻字符系列是由偶数还是奇数组成。此外,还必须删除用于转义的反斜杠和双逗号,这可能需要额外的替换功能。

4

2 回答 2

1
$text = 'Hello, World \,asdas, 123';
$data = preg_split('/(?<=[^\\\]),/',$text);
print_r($data);

结果

Array ( [0] => Hello [1] => World \,asdas [2] => 123 )
于 2013-08-09T20:10:38.197 回答
0

为此,我将运行preg_replace_callback它允许您计算使用的转义字符并确定如何处理它们。如果事实证明 coma 没有转义,请将其替换为用户在其输入中不应使用的某些不可打印字符,然后由该字符爆炸:

<?php

$str = "One,Two\\, Two\\\\,Three";
$delimiter = chr(0x0B); // vertical tab, hope you do not expect it in the input?


$escaped = preg_replace_callback('/(\\\\)*,?/', function($m) use($delimiter){
    if(!isset($m[1]) || strlen($m[0])%2) {
        return str_replace(',',$delimiter,preg_replace('/\\\\{2}/','\\',$m[0])); 
    } else {
        return str_replace('\\,',',', preg_replace('/\\\\{2}/','\\',$m[0]));
    }
}, $str);
$array = explode($delimiter, $escaped);
于 2013-08-09T20:36:10.230 回答