2011-09-27 96 views
1

我有一个来自SQL Server的管道分隔转储文件,我想将它导入到MySQL中。这些行由\r\n分隔,并且该序列也发生在某些领域!所以我想使用一个正则表达式来查找实际的行,并且使用一个INSERT声明。使用preg_split捕获分隔符的问题

但是,我遇到了麻烦,包括匹配字符串中的分隔符。我认为使用PREG_SPLIT_DELIM_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 
) 

我的分隔符丢失。

$ 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 

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

回答

6

您需要将您的分隔符分组为括号,否则_DELIM_CAPTURE将不起作用。

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

这里,manual mentions it顺便作为标志描述:

PREG_SPLIT_DELIM_CAPTURE
如果该标志被设置,在分隔符模式中的括号表达式将被捕获并返回为好。

+0

我读了这一点,但我不明白是什么意思括号,虽然它现在相当明显:P – user151841

+0

OK,这给了我与分隔符是一个元素的数组而碎片是下一个...有没有办法让它们成为同一个元素的一部分?断言或类似的东西? – user151841

+1

不,'preg_split'只会将它们分开。如果你想将它们组合起来,你将不得不构建一个'preg_match_all'模式。 – mario