在PHP中匹配模式时将文本拆分为行
可能重复:在PHP中匹配模式时将文本拆分为行,php,regex,Php,Regex,可能重复: 我有一组数据都在一大块文本中。它看起来类似于以下内容: 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测试数据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没有保留delimeter。我试着将preg_分割改为
$split = preg_split("/\d+\\/\d+ /", $contents, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE
但是,这将返回与上面相同的结果,行首没有00/00
我做错什么了吗?或者他们的方法更好吗?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;
您可以告诉
preg_split()
在字符串中的任何一点进行拆分,该点后面是数字,使用斜杠数字
之所以使用
PREG\u SPLIT\u NO\u EMPTY
标志,是因为字符串的最开始也是有三位数字的点,因此此处发生空拆分。我们可以将正则表达式更改为不在字符串的最开始处拆分,但这会使一目了然的理解变得更加困难,而标志非常清楚。您确定该字符串中没有换行符吗?可能只是你的操作系统没有正确处理它们。如果真的没有换行符,请在匹配前用preg_replace插入。将拆分模式用a包装,完整的匹配项将包含在拆分中。@DaveRandom a lookahead在这里可能更有意义。我必须使用它并思考一下,但是的,lookahead比lookahead更有意义+1答案无耻地复制并粘贴了昨天的答案我认为盗取你自己的答案是可以接受的:-)非常感谢,我需要学习更多关于正则表达式的知识。实际上,你不必为那些修饰符操心。只需匹配日期之前的空格以及日期本身。确保在前瞻之外执行此操作,并使用+
而不是*
<代码>'%[]+(?=\d+/\d+%'。(方括号不是真的需要,我只是觉得这样更容易理解。)谢谢!我不知道我能做到。我编辑了我的答案。编辑:事实上,我现在觉得自己很愚蠢。我想我需要睡一觉。如果你更换PHP\u EOL。“$0”
和“\n$3”
,他得到了他想要的输出没有,他想要01/02、01/03等的输出。仅供参考,第三组永远不会捕获任何东西。/U
修饰符使*
变为非贪婪的,并且将非贪婪的量词用作正则表达式中的最后一项是毫无意义的。它总是以允许使用的最小字符数开始,并且在它之后没有任何东西强迫它使用更多的字符。
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
$result = preg_split('#(?=\d+/\d+)#', $contents, -1, PREG_SPLIT_NO_EMPTY);