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

Php 将逗号分隔的文本拆分为数组,但忽略转义分隔符\,,php,regex,Php,Regex,正文是 a,b,c,d\,e,f,g 我想根据分隔符,将它们分割成一个数组,忽略转义的,如\,e ["a","b","c", "d,e", "f", "g"] 我试过像这样使用explode explode(',', $data); 但是它无法识别文本中转义的\。 如何拆分文本并忽略转义分隔符?您可以使用preg\u split根据未转义的逗号进行拆分(使用逗号上的负数查找以检查其前面是否有\),尽管您需要进行后期处理以删除反斜杠: $string = 'a,b,c,d\,e,f,g';

正文是

a,b,c,d\,e,f,g 
我想根据分隔符
将它们分割成一个数组,忽略转义的
\,e

["a","b","c", "d,e", "f", "g"]
我试过像这样使用explode

explode(',', $data);
但是它无法识别文本中转义的
\

如何拆分文本并忽略转义分隔符?

您可以使用
preg\u 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);

您可以使用
preg\u 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);

您可以使用正则表达式来实现这一点,它们非常好,但也很难理解。为什么不做一些更简单的事情,比如:

$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   = "";
    }
}

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

你可以使用正则表达式,它们很好,但也很难理解。为什么不做一些更简单的事情,比如:

$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   = "";
    }
}

我知道这不是一个流行的观点,但是改变一些你实际上可以很容易理解的东西要比努力理解密集正则表达式有趣得多。当然,这是非常主观的。

没有正则表达式

$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;
});

没有正则表达式

$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;
});
试试这个

$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
)
试试这个

$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
)

我在打手机,这就是为什么你比我快了10秒:-)这和吗?@NigelRen发现得很好。的确如此,但我消除反斜杠的方法比那些答案中提出的任何方法都要好(至少,我认为是这样)。你仍然可以像傻瓜一样接近——考虑到我在看到傻瓜之前回答了这个问题,我认为我在道德上是做不到的。我在打手机,这就是为什么你打了我大约10秒:-)这和?@NigelRen well Spotting。的确如此,但我消除反斜杠的方法比那些答案中提出的任何方法都要好(至少,我认为是这样)。你仍然可以像一个被愚弄者一样接近——考虑到我在看到被愚弄者之前回答了这个问题,我认为我在道德上是做不到的。输入中是否会有真正的反斜杠,例如:
a,b\\,c,d\,e,f,g
?输入中是否会有真正的反斜杠,例如:
a,b\\,c,d\,e,f,g
?那么,这是主观的吗?我发现了一篇关于Hackernoon的文章,这篇文章用文字表达得比我以往任何时候都好:好吧,这是主观的吗?我在Hackernoon上找到了一篇文章,这篇文章用文字表达得比我以往任何时候都好:字符替换是一种容易出错的技术,因为它可能会危害合法数据。字符替换是一种容易出错的技术,因为它可能会危害合法数据。如果
$ignore
位于第一个偏移量怎么办?什么如果
$ignore
在第一个偏移处?