【问题标题】:problem capturing delimiter with preg_split使用 preg_split 捕获分隔符的问题
【发布时间】:2011-09-27 16:40:55
【问题描述】:

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

但是,我在匹配字符串中包含分隔符时遇到了问题。我认为使用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

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

【问题讨论】:

    标签: php preg-split


    【解决方案1】:

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

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

    这里,manual mentions it en passant 作为标志描述:

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

    【讨论】:

    • 我读过那个,但我不明白括号是什么意思,虽然它现在相当明显:P
    • 好的,这给了我一个数组,其中分隔符是一个元素,而分片是下一个元素......有没有办法让它们成为同一个元素的一部分?断言或类似的东西?
    • 不,preg_split 只会将它们分开。如果您希望将它们组合起来,则必须构造一个 preg_match_all 模式。
    【解决方案2】:

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

    请改为检查这个: preg_split how to include the split delimiter in results?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      相关资源
      最近更新 更多