我有一组数据都在一大块文本中。它看起来类似于以下内容;
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。
我做错了什么或是他们更好的方法来实现这个目标?
答案 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