PHP正则需求:保留数字与首个小数点并截断至两位小数
问题
需要通过PHP的单次preg_replace()调用,用单一正则表达式实现以下功能:
- 从任意输入字符串中仅保留数字和首次出现的小数点
- 若小数点后位数超过两位则截断至两位
- 按从左到右解析字符串,覆盖无小数点、无数字等各类输入场景
示例输入输出
| 输入字符串 | 期望输出 |
|---|---|
| *$234.345 | 234.34 |
| (9.9) | 9.9 |
| $34.455r.4r45,45.45 | 34.45 |
| 2023-05-29 03:40:11Z, License: CC BY-SA 4.0 | 202305290340114.0 |
| 9.95,6.432,0.3 | 9.95 |
| po2iaw5e.ro1i7im8jjks;fl32;i.u12ma | 25.17 |
| oias25.spkks | 25. |
| 4545 | 4545 |
| oi.as2.5.6spkks | .25 |
| oi.as..spkks | . |
本人尝试了如下表达式但无效:
preg_replace('/^\d+(\.\d{0,2})?$/', '', $input_string);
解决方案
使用以下正则表达式即可实现需求:
$result = preg_replace('/^[^0-9.]*(\d*\.?\d{0,2})?.*$/', '$1', $input_string);
正则表达式解析
^[^0-9.]*:匹配字符串开头所有非数字、非小数点的字符,直接跳过(\d*\.?\d{0,2})?:核心捕获组,负责提取符合要求的内容:\d*:匹配小数点前的任意数量数字(包括0个,比如.25这种情况)\.?:匹配0个或1个小数点(仅保留首次出现的)\d{0,2}:匹配小数点后最多2个数字,超过的直接截断?:允许整个捕获组为空,处理输入中无数字也无有效小数点的情况
.*$:匹配捕获组之后的所有剩余字符,全部替换为空- 最终用捕获组
$1作为替换结果,只保留我们需要的内容
效果验证
将上述代码代入各示例输入,均可得到预期输出:
- 输入
*$234.345→ 捕获234.34→ 输出234.34 - 输入
oi.as2.5.6spkks→ 捕获.25→ 输出.25 - 输入
oi.as..spkks→ 捕获.→ 输出. - 输入
4545→ 捕获4545→ 输出4545
内容的提问来源于stack exchange,提问作者Jimski
相关产品推荐
相关产品推荐

