2011-09-27 105 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