如何在PHP中找到字符串内的日期并提取它?'
示例:我在字符串
中有一个日期$status = "OK, 26.10.2022 13:24:00, Delivered Zak";
但是下次我只能得到这样的字符串
$status = "28.10.2022 11:20:00, Delivered";
所以用","在这里没有选择,因为每次都在不同的位置。我怎么能每次都有这样的约会?谢谢你的建议。
您可以使用正则表达式来获取字符串中的日期:
// examples
$statuses = [
"OK, 26.10.2022 13:24:00, Delivered Zak",
"28.10.2022 11:20:00, Delivered",
];
foreach ($statuses as $status) {
// Grab 'xx.xx.xxxx xx:xx.xx'
preg_match('~d{2}.d{2}.d{4}sd{2}:d{2}:d{2}~', $status, $matches);
// Convert to date
// TODO : test if $matches is not empty
$date = DateTime::createFromFormat("d.m.Y H:i:s", reset($matches));
// echo formatted for the test
echo $date->format("Y-m-d H:i:s")."n";
}
输出:
2022-10-26 13:24:00
2022-10-28 11:20:00
此解决方案使用修剪来删除日期表达式前后的虚假字符。A..Z去掉所有大写字母。简单地使用date_create也可以识别一些其他的日期格式。
$statuses = [
"OK, 26.10.2022 13:24:00, Delivered Zak",
"28.10.2022 11:20:00, Delivered",
"christmas eve 24 Dec 2020 19:00",
"ABC 2022-09-12 13:45, and so on",
];
foreach ($statuses as $status) {
$date = date_create(trim($status,"A..Za..z, "));
echo $date->format("Y-m-d H:i:s")."<br>n";
}
输出:
2022-10-26 13:24:00
2022-10-28 11:20:00
2020-12-24 19:00:00
2022-09-12 13:45:00
演示:https://3v4l.org/uqAmm
如果在特殊情况下trim是不够的,或者如果只接受某些日期格式,可以使用preg_replace来代替trim。
preg_replace('/^[^d]*(.+?)[a-z ,]*$/iu','$1',$status);