PHP数组中3字母月份转数字结果异常,求问题原因及解决
问题分析与解决
需求
将数组中每个字符串开头到空格前的3字母月份替换为对应数字月份。
用户编写的代码
初始匹配代码
$arr = [ "May Hello", "Jun Hello12", "Jul 3" ]; $str = $arr[0]; $matches = []; $pattern = '/^\w+\s/'; preg_match_all($pattern, $str, $matches);
替换代码
$pattern = [ '/^\w+\s/' => date('m', strtotime($matches[0][0])) . ' ', // first string until space ]; $arr = preg_replace(array_keys($pattern), array_values($pattern), $arr); echo '<pre>'; print_r($arr); echo '</pre>';
执行后非预期结果
Array ( [0] => 05 7 Hello [1] => 05 Hello12 [2] => 05 3 )
预期结果
Array ( [0] => 05 7 Hello [1] => 06 Hello12 [2] => 07 3 )
代码错误点
- 仅匹配了第一个元素的月份:你只对数组第一个元素
$arr[0]做了正则匹配,$matches里只有"May "的结果,后续替换时所有元素都用了这个固定的05,自然得不到各元素对应的月份。 - 替换值无法动态计算:
preg_replace的替换值是预先计算好的静态字符串,没办法针对每个元素的匹配内容单独转换月份。
正确实现代码
改用preg_replace_callback,它支持对每个匹配结果动态处理:
$arr = [ "May Hello", "Jun Hello12", "Jul 3" ]; $arr = preg_replace_callback( '/^(\w+)\s/', // 捕获开头的月份部分 function($matches) { // 将捕获到的月份转为两位数字格式,保留后续空格 return date('m', strtotime($matches[1])) . ' '; }, $arr ); echo '<pre>'; print_r($arr); echo '</pre>';
代码说明
- 正则
/^(\w+)\s/用捕获组(\w+)提取出开头的月份字符串; - 回调函数针对每个匹配到的月份,用
strtotime识别后,通过date('m')格式化为两位数字月份; - 遍历数组所有元素,逐个完成替换,最终得到符合预期的结果。
内容的提问来源于stack exchange,提问作者Cem Firat
相关产品推荐
相关产品推荐

