PHP使用preg_match_all提取至少2位小数的数值问题排查
错误原因
- 分隔符适配错误:目标字符串中的金额类小数使用逗号
,作为小数分隔符,你正则中写的\.仅能匹配英文句号,导致大量合法的两位小数值(如47,05)无法被匹配,反而仅匹配到了其他场景下用点做分隔的数值。 - 未限制小数位数:你使用的
\d*表示匹配0位及以上小数,既会匹配到仅1位小数的不符合要求的数值(如2,4),也完全没有满足「至少2位小数」的提取规则。 - 缺少边界校验:没有对数值的前后边界做限制,容易出现长数字片段的误匹配;你提到的纯整数
89633988被\d+\.\d*匹配属于异常情况,大概率是测试时正则书写错误或上下文匹配逻辑问题。
修正方案
使用如下正则即可满足提取需求:
preg_match_all('!\b\d+[,.]\d{2,}\b!', $myString, $matches);
正则说明:
\b匹配单词边界,避免从长数字串中截取片段\d+匹配整数部分至少1位数字[,.]同时兼容点、逗号两种小数分隔符,适配你字符串中的所有小数场景\d{2,}限制小数部分至少有2位数字,完全匹配「至少2位小数」的要求
运行后$matches[0]中会输出所有符合要求的数值:37.500、47,05、8,94、47,05、8,94、55,99、55,99、47,05、55,99、55,99、0,00、0,00、0,00。
内容的提问来源于stack exchange,提问作者Trombone0904
相关产品推荐
相关产品推荐

