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
相关产品推荐
相关产品推荐

