在PHP中匹配模式时将文本拆分为行

时间:2013-01-02 11:54:58

标签: php regex

  

可能重复:
  Splitting string array based upon digits in php?

我有一组数据都在一大块文本中。它看起来类似于以下内容;

  

01/02 10:45:01测试数据01/03 11:52:09测试数据01/04 18:63:05测试数据01/04 21:12:09测试数据01/04 13:10: 07测试数据01/05 07:08:09测试数据01/05 10:07:08测试数据01/05 08:00:09测试数据01/06 11:01:09测试数据

我试图简单地使这个可读(例如见下文),但每个线路上唯一远程相似的是开始遵循00/00模式。

01/02 10:45:01 test data 
01/03 11:52:09 test data 
01/04 18:63:05 test data 
01/04 21:12:09 test data 
01/04 13:10:07 test data 
01/05 07:08:09 test data 
01/05 10:07:08 test data 
01/05 08:00:09 test data 
01/06 11:01:09 test data 

通过将其与正则表达式模式匹配,我已经把它拆分出来了;

$split = preg_split("/\d+\\/\d+ /", $contents, -1, PREG_SPLIT_NO_EMPTY);

这就是输出;

Array ( [0] => 
        [1] => 10:45:01 test data 
        [2] => 11:52:09 test data 
        [3] => 18:63:05 test data 
        [4] => 18:63:05 test data 
        ...and so on

但正如你所看到的那样,问题在于preg_split并没有保留分隔符。我尝试将preg_split更改为;

$split = preg_split("/\d+\\/\d+ /", $contents, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE

然而,返回与上面相同,在行的开头没有00/00。

我做错了什么或是他们更好的方法来实现这个目标?

2 个答案:

答案 0 :(得分:4)

您可以通过lookahead assertion告诉preg_split()在字符串中的任何一点进行拆分,后跟数字斜杠数字。

$result = preg_split('#(?=\d+/\d+)#', $contents, -1, PREG_SPLIT_NO_EMPTY);

使用PREG_SPLIT_NO_EMPTY标志,因为字符串的开头也是有三个数字的点,因此这里会发生空分割。我们可以改变正则表达式,使其不会在字符串的最开始分割,但这会让它一目了然地变得难以理解,而标志非常清晰。

答案 1 :(得分:2)

PHP:

<?php

$text = '01/02 10:45:01 test data 01/03 11:52:09 test data 01/04 18:63:05 test data 01/04 21:12:09 test data 01/04 13:10:07 test data 01/05 07:08:09 test data 01/05 10:07:08 test data 01/05 08:00:09 test data 01/06 11:01:09 test data';

$text = preg_replace('/(\d{2})\/(\d{2})(.*)/U', PHP_EOL . "$0", $text);

echo $text;

输出:

01/02 10:45:01 test data 
01/03 11:52:09 test data 
01/04 18:63:05 test data 
01/04 21:12:09 test data 
01/04 13:10:07 test data 
01/05 07:08:09 test data 
01/05 10:07:08 test data 
01/05 08:00:09 test data 
01/06 11:01:09 test data

Demo