проблема захвата разделителя с помощью preg_split - PullRequest
1 голос
/ 27 сентября 2011

У меня есть файл дампа с разделителями в виде трубы с 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 ]

6 голосов
/ 27 сентября 2011

Вы должны сгруппировать ваш разделитель в круглые скобки, иначе _DELIM_CAPTURE не будет иметь никакого эффекта.

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

Здесь, руководство упоминает его en passant как описание флага:

PREG_SPLIT_DELIM_CAPTURE
Если этот флаг установлен, выражение в скобках в шаблоне разделителя будет также захвачено и возвращено.

1 голос
/ 31 марта 2014

Ответ выше даст вам разделитель в отдельном элементе массива.

Отметьте вместо этого: preg_split, как включить разделитель в результаты?

...