Php 使用preg_split捕获分隔符时出现问题

Php 使用preg_split捕获分隔符时出现问题,php,preg-split,Php,Preg Split,我有一个来自SQL Server的管道分隔转储文件,我想将其导入MySQL。行由\r\n分隔,该序列也出现在某些字段中!所以我想用一个正则表达式来找到实际的行,并用它们做一个INSERT语句 但是,在匹配字符串中包含分隔符时遇到问题。我原以为使用PREG\u SPLIT\u DELIM\u CAPTURE会奏效,但显然我做错了什么。我的分隔符是三个空格,后跟三个数字,这实际上是我需要的行id: $ cat test.php <? $string = ' 897|a|Hello\r\n

我有一个来自SQL Server的管道分隔转储文件,我想将其导入MySQL。行由
\r\n
分隔,该序列也出现在某些字段中!所以我想用一个正则表达式来找到实际的行,并用它们做一个
INSERT
语句

但是,在匹配字符串中包含分隔符时遇到问题。我原以为使用
PREG\u SPLIT\u DELIM\u CAPTURE
会奏效,但显然我做错了什么。我的分隔符是三个空格,后跟三个数字,这实际上是我需要的行id:

$ cat test.php
<?
$string = '   897|a|Hello\r\n   583|b|Line\r\nBreak\r\n   332|c|Yet\r\nMore\r\nLine\r\nBreaks\r\n';

$lines = preg_split( '/   \d{3}\|/', $string, NULL, PREG_SPLIT_DELIM_CAPTURE);
print_r($lines);

$ php test.php
Array
(
    [0] => 
    [1] => a|Hello\r\n
    [2] => b|Line\r\nBreak\r\n
    [3] => c|Yet\r\nMore\r\nLine\r\nBreaks\r\n
)

我做错了什么,或者如何得到我想要的?

您需要将分隔符分组到括号中,否则_DELIM_捕获将无效

$lines = preg_split( '/   (\d{3}\|)/', $string, NULL, PREG_SPLIT_DELIM_CAPTURE);
此处,作为标志说明的中途:

预分割捕获
如果设置了此标志,分隔符模式中的括号表达式也将被捕获并返回


您需要将分隔符分组到括号中,否则_DELIM_捕获将无效

$lines = preg_split( '/   (\d{3}\|)/', $string, NULL, PREG_SPLIT_DELIM_CAPTURE);
此处,作为标志说明的中途:

预分割捕获
如果设置了此标志,分隔符模式中的括号表达式也将被捕获并返回


上面的答案将在单独的数组元素中提供分隔符

改为选中此选项:
以上答案将在单独的数组元素中给出分隔符

改为选中此选项:

我读过这篇文章,但我不明白括号中的意思,尽管现在已经很明显了:POK,它给了我一个数组,分隔符是一个元素,碎片是下一个元素。。。有没有办法让它们成为同一元素的一部分?断言或类似的东西?不,
preg_split
只会单独给出它们。如果你想把它们结合起来,你就必须构造一个
preg\u match\u all
模式。我读过,但我不明白括号的意思,尽管现在很明显:POK,它给了我一个数组,分隔符是一个元素,分片是下一个元素。。。有没有办法让它们成为同一元素的一部分?断言或类似的东西?不,
preg_split
只会单独给出它们。如果您希望将它们组合起来,则必须构建一个
preg\u match\u all
模式。