用于转义字符的Php正则表达式


Php regexp for escaping characters

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

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

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

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

"嗨,堆栈溢出"可以写成"嗨,,堆栈溢出"或"嗨'',堆栈溢出。

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

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

结果

Array ( [0] => Hello [1] => World ',asdas [2] => 123 )

为此,我将运行preg_replace_callback,它允许您计算使用的转义字符并决定如何处理它们。如果昏迷没有逃脱,请将其替换为用户在输入中不应使用的某些不可打印字符,然后按此字符爆炸:

<?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);