PHP循环处理数据库字符串:仅保留dd-mm-yyyy格式日期
提取字符串中的dd-mm-yyyy格式日期
我来帮你搞定这个日期提取的问题!你现在的需求是从数据库返回的字符串里只保留dd-mm-yyyy格式的日期,其他所有内容都删掉对吧?之前用str_replace替换固定文本的方法确实不太靠谱,毕竟文本里混着数字,没法简单粗暴删字母解决。
最稳妥的办法是用正则表达式精准匹配日期格式,PHP里的preg_match_all函数刚好能帮我们搞定这个事。下面给你两种方案,按需选择:
基础匹配方案(兼容1/2位的日/月)
这个方案能匹配所有符合dd-mm-yyyy格式的串,不管日和月是1位还是2位(比如5-3-2024或者05-03-2024都能抓到):
// 从数据库获取原始字符串 $originalText = $row['AboOpmerking']; // 定义匹配dd-mm-yyyy格式的正则 $datePattern = '/\b\d{1,2}-\d{1,2}-\d{4}\b/'; // 提取所有符合格式的日期 preg_match_all($datePattern, $originalText, $matchedDates); // 把匹配到的日期拼接成字符串(多个日期用逗号分隔,可按需调整) $cleanedContent = !empty($matchedDates[0]) ? implode(', ', $matchedDates[0]) : ''; // 存入结果数组 $result[] = [ 'AboOpmerking' => $cleanedContent, ];
严格匹配方案(过滤无效日期)
如果需要过滤掉像32-13-2024这种明显无效的日期,可以用更精准的正则,限制日在1-31、月在1-12范围内:
$originalText = $row['AboOpmerking']; // 严格匹配合法的dd-mm-yyyy日期 $strictDatePattern = '/\b(0[1-9]|[12][0-9]|3[01])-(0[1-9]|1[012])-\d{4}\b/'; preg_match_all($strictDatePattern, $originalText, $strictMatchedDates); $cleanedContent = !empty($strictMatchedDates[0]) ? implode(', ', $strictMatchedDates[0]) : ''; $result[] = [ 'AboOpmerking' => $cleanedContent, ];
为啥这个方法比你之前的好用?
你之前的str_replace只能替换你预先定义好的文本,但如果数据库里的字符串有新的表述(比如突然出现别的说明文字),就会失效。用正则的话,不管中间夹了什么内容,只要是符合格式的日期,都能精准抓出来,适应性强多了。
内容的提问来源于stack exchange,提问作者Kees Sonnema
相关产品推荐
相关产品推荐

