按分隔符拆分字符串,但如果它已转义则不会

Ant*_*ton 52 php regex preg-split

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

1|2\|2|3\\|4\\\|4
Run Code Online (Sandbox Code Playgroud)

分隔符是|和转义分隔符\|.此外,我想忽略逃脱反斜杠,因此\\||仍然是一个分隔符.

所以使用上面的字符串,结果应该是:

[0] => 1
[1] => 2\|2
[2] => 3\\
[3] => 4\\\|4
Run Code Online (Sandbox Code Playgroud)

Nik*_*kiC 107

使用黑暗魔法:

$array = preg_split('~\\\\.(*SKIP)(*FAIL)|\|~s', $string);
Run Code Online (Sandbox Code Playgroud)

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

  • @eyelidlessness:您可以查看[PCRE文档](http://www.pcre.org/pcre.txt).搜索`(*SKIP)`.你会找到所有那些回溯控制动词的文档,如*SKIP,*FAIL,*ACCEPT,*PRUNE,......那里. (17认同)
  • 是否有`(*SKIP)(*FAIL)`的文档? (6认同)
  • +1 @NikiC都提供了PCRE文档的链接,让我想读它. (5认同)
  • 在PHP解析字符串后,@ AmalMurali`a \\\ a`将是***反斜杠;)`a \\\ a`与`a \\\\ a`到PHP相同:) (2认同)

Bar*_*ers 11

而不是split(...),IMO更直观地使用某种类似于词法标记器的"扫描"功能.在PHP中,这将是preg_match_all功能.你只是说你想匹配:

  1. 除了\或之外的东西|
  2. 或者a \后跟a \|
  3. 重复#1或#2至少一次

以下演示:

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

将打印:

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

Array
(
    [0] => 1
    [1] => 2\|2
    [2] => 3\\
    [3] => 4\\\|4
)
Run Code Online (Sandbox Code Playgroud)