You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何使用preg_match_all从字符串中提取所有合法日期值

方案1:直接使用preg_match_all匹配(基础实现)

完全可以用preg_match_all实现初步的日期提取,你可以用兼容多格式的正则表达式来匹配目标格式,示例代码如下:

// 兼容你列出的3种格式+2位年简写的正则
$datePattern = '/(
    \d{1,2}\.\d{1,2}\.\d{2,4}                # 14.10.2021、14.10.21格式
    |\d{1,2}\/\d{1,2}\/\d{2,4}               # 10/14/2021、10/14/21格式
    |\d{1,2}\.\s*(January|February|March|April|May|June|July|August|September|October|November|December)\s*\d{2,4}  # 10. October 2021、10. October 21格式
)/ix';
preg_match_all($datePattern, $content, $dateMatches);

注意:这个方案只能匹配格式符合的字符串,无法判断日期合法性,比如会把31.02.2023这种不存在的日期也匹配出来。


方案2:正则匹配+日期合法性校验(更稳妥,推荐)

如果需要提取的是PHP可识别的合法日期,建议在正则匹配后增加一层日期校验,过滤掉格式对但实际不存在的日期,示例代码如下:

$datePattern = '/(
    \d{1,2}[.\/]\d{1,2}[.\/]\d{2,4}
    |\d{1,2}\.\s*(?:January|February|March|April|May|June|July|August|September|October|November|December)\s*\d{2,4}
)/ix';
preg_match_all($datePattern, $content, $rawDates);

$validDates = [];
// 兼容的日期格式列表,可根据需求增减
$allowedFormats = [
    'd.m.Y', 'd.m.y',
    'm/d/Y', 'm/d/y',
    'd. F Y', 'd. F y'
];

foreach ($rawDates[0] as $rawDate) {
    foreach ($allowedFormats as $format) {
        $dateObj = DateTime::createFromFormat($format, trim($rawDate));
        if ($dateObj && $dateObj->format($format) === trim($rawDate)) {
            $validDates[] = $dateObj->format('Y-m-d'); // 可自定义输出格式
            break;
        }
    }
}
// 最终$validDates里就是所有合法的、PHP可识别的日期

这个方案的容错率更高,也能保证提取到的日期都是真实存在的合法值。

内容的提问来源于stack exchange,提问作者Trombone0904

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:06:02