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

时间:2013-08-09 20:04:03

标签: php regex escaping

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

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

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

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

“嗨,Stackoverflow”将被写为“Hi ,, Stackoverflow”或“Hi \,Stackoverflow”。

但我觉得很难评估这样的字符串。我尝试过preg splitting,但是没有办法看看一个lookbehind或lookahead系列字符是由偶数还是奇数组成。此外,还必须删除用于转义的反斜杠和双逗号,这可能需要额外的替换功能。

2 个答案:

答案 0 :(得分:1)

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

结果

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

答案 1 :(得分:0)

为此,我将运行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);