使用preg_split捕获分隔符的问题

时间:2011-09-27 16:40:56

标签: php preg-split

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

但是,我在匹配字符串中包含分隔符时遇到问题。我认为使用PREG_SPLIT_DELIM_CAPTURE可以做到这一点,但显然我做错了。我的分隔符是三个空格,后跟三个数字,这实际上是我需要的行:

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

我的分隔符丢失了。

$ php -v
PHP 5.3.3-7+squeeze1 with Suhosin-Patch (cli) (built: Mar 18 2011 17:22:52) 
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

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

2 个答案:

答案 0 :(得分:6)

您需要将分隔符分组为括号,否则_DELIM_CAPTURE将无效。

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

此处,manual mentions it en passant作为标记说明:

  

PREG_SPLIT_DELIM_CAPTURE
  如果设置了此标志,则将捕获并返回分隔符模式中的带括号的表达式。

答案 1 :(得分:1)

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

检查一下: preg_split how to include the split delimiter in results?