按分隔符拆分字符串,但如果字符串被转义,则不拆分字符串

2022-08-30 10:23:08

如何通过分隔符拆分字符串,但如果它被转义,则不能拆分字符串?例如,我有一个字符串:

1|2\|2|3\\|4\\\|4

分隔符是 ,转义分隔符是 。此外,我想忽略转义的反斜杠,所以在 仍然是一个分隔符。|\|\\||

因此,使用上面的字符串,结果应该是:

[0] => 1
[1] => 2\|2
[2] => 3\\
[3] => 4\\\|4

答案 1

使用黑魔法:

$array = preg_split('~\\\\.(*SKIP)(*FAIL)|\|~s', $string);

\\\\.匹配后跟字符的反斜杠,跳过它并匹配分隔符。(*SKIP)(*FAIL)\|


答案 2

而不是,IMO更直观地使用某种“扫描”功能,其操作方式类似于词汇分词器。在PHP中,这将是函数。你只是说你想匹配:split(...)preg_match_all

  1. 除 a 或 以外的其他内容\|
  2. 或 a 后跟一个 或\\|
  3. 重复 #1 或 #2 至少一次

以下演示:

$input = "1|2\\|2|3\\\\|4\\\\\\|4";
echo $input . "\n\n";
preg_match_all('/(?:\\\\.|[^\\\\|])+/', $input, $parts);
print_r($parts[0]);

将打印:

1|2\|2|3\\|4\\\|4

Array
(
    [0] => 1
    [1] => 2\|2
    [2] => 3\\
    [3] => 4\\\|4
)

推荐