将用逗号分隔的文本拆分为数组,但忽略转义的定界符\,

时间:2019-04-28 07:42:11

标签: php regex

文本为

a,b,c,d\,e,f,g 

我想将它们分成基于定界符,的数组,并像,那样忽略转义的\,e

["a","b","c", "d,e", "f", "g"]

我尝试过使用爆炸之类的

explode(',', $data);

,但无法识别文本中的转义\。 如何拆分文本并忽略转义的分隔符?

4 个答案:

答案 0 :(得分:3)

您可以使用preg_split根据未转义的逗号进行拆分(在逗号后面使用负向后看以检查其前面是否没有\),尽管您需要发布-过程以删除反斜杠:

$string = 'a,b,c,d\,e,f,g';
$array = preg_split('/(?<!\\\\),/', $string);
$array = array_map(function ($v) { return str_replace('\\', '', $v); }, $array);
print_r($array);

输出:

Array ( [0] => a [1] => b [2] => c [3] => d,e [4] => f [5] => g )

答案 1 :(得分:0)

您可以为此使用正则表达式,它们虽然很好,但也很难理解。为什么不这样简单一些:

$input  = "a,b,c,d\,e,f,g,h\,i\,j,k,l,m";
$output = [];
$buffer = "";

foreach (explode(",", $input) as $part) {
    if (substr($part, -1) == "\\") $buffer .= $part;
    else {
       $output[] = $buffer . $part;
       $buffer   = "";
    }
}

print_r($output);

这不会删除反斜杠,但是现在很容易添加或删除反斜杠。这与删除它们的算法相同:

foreach (explode(",", $input) as $part) {
    if (substr($part, -1) == "\\") $buffer .= substr($part, 0, -1) . ',';
    else {
       $output[] = $buffer . $part;
       $buffer   = "";
    }
}

我知道这不是一种流行的观点,但是更改一些实际上易于理解的内容比努力理解密集的正则表达式要有趣得多。当然,这都是很主观的。

答案 2 :(得分:0)

没有正则表达式

$ignore = '\\';
$arr = explode(',','a,b,c,d\,e,f,g');
array_walk($arr, function(&$v, $k) use ($ignore,&$arr){
  if(strpos($v, $ignore)){ 
   $v = str_replace($ignore, ',', $v).$arr[$k+1];
   unset($arr[$k+1]);
  }
 return $v;
});

答案 3 :(得分:0)

尝试

$string = 'a,b,c,d\,e,f,g';
$str = str_replace("\,", '\\', $string);
$array = explode(',', $str);
print_r(str_replace('\\',',',$array));

结果

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d,e
    [4] => f
    [5] => g
)