preg_match的测试成功,但preg_split失败


A test of preg_match is successful but preg_split fails

我正在尝试测试一种方法,通过这种方法,我可以分解包含多个学术出版物记录的单个字符串。没有什么比一个有意义的分隔符将一条记录与下一条记录分隔开来更方便的了。但我相信这是可以实现的,因为每个记录都以日期加逗号和空格结束(除非后面没有其他记录,在这种情况下,它只以日期结束),比如"YYYY-MM-DD"。

我已经从一个涉及字符串的简单测试开始,并确认正则表达式能够识别我要寻找的模式:

$date="2012-09-12, ";
if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]), $/",$date))
    {
        echo("yes");
    }else{
        echo("no");

然而,当我试图通过使用真实数据样本和preg-split()将其带入下一步时,split不起作用。我无法理解为什么这个简单的测试,取自手册中的示例1,未能导致字符串被拆分:

<?php
$pubs="L.J. Santodonato, Y. Zhang, M. Feygenson, C.M. Parish, M.C. Gao, R.J. Weber, J.C. Neuefeind, Z. Tang, P.K. Liaw~Deviation from high-entropy configurations in the atomic distributions of a multi-principal-element alloy.~NATURE COMMUNICATIONS~6~2015~~~~0~~0~~2015-11-21, S. Liu, M.C. Gao, P.K. Liaw, Y. Zhang~Microstructures and mechanical properties of AlxCrFeNiTi 0.25 alloys.~JOURNAL OF ALLOYS AND COMPOUNDS~619~2015~610~~~0~~0~~2015-11-21";
$pubsArray = preg_split("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]), $/", $pubs);
print_r($pubsArray);
?>

在示例字符串$pubs中可以找到与相同模式匹配的数据,但我得到的只是一个包含完整字符串的单个元素的数组。关于下一步该做什么,我已经没有主意了,如果有任何建议,我将不胜感激。

但我相信这是可以实现的,因为每个记录都以日期加逗号和空格结束(除非后面没有其他记录,在这种情况下,它只以日期结束),比如"YYYY-MM-DD"。

当您试图在出现日期时拆分字符串时,您可以使用像/'d{4}(-'d{2}){2}/这样的简单正则表达式。由于您没有验证日期,因此无需匹配所有月份和日期。

要在date处拆分字符串,您应该使用以下regex。

Regex:/(?<='d{4}(-'d{2}){2}),'s*/查找后面跟着可选逗号和空格的日期,并在,[space]上进行拆分,因为我想您希望保留发布日期。

Php代码

<?php
$pubs="L.J. Santodonato, Y. Zhang, M. Feygenson, C.M. Parish, M.C. Gao, R.J. Weber, J.C. Neuefeind, Z. Tang, P.K. Liaw~Deviation from high-entropy configurations in the atomic distributions of a multi-principal-element alloy.~NATURE COMMUNICATIONS~6~2015~~~~0~~0~~2015-11-21, S. Liu, M.C. Gao, P.K. Liaw, Y. Zhang~Microstructures and mechanical properties of AlxCrFeNiTi 0.25 alloys.~JOURNAL OF ALLOYS AND COMPOUNDS~619~2015~610~~~0~~0~~2015-11-21";
$pubsArray = preg_split("/(?<='d{4}(-'d{2}){2}),'s*/", $pubs);
print_r($pubsArray);
?>

Regex101演示

Ideone演示