You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP正则需求:保留数字与首个小数点并截断至两位小数

问题

需要通过PHP的单次preg_replace()调用,用单一正则表达式实现以下功能:

  • 从任意输入字符串中仅保留数字和首次出现的小数点
  • 若小数点后位数超过两位则截断至两位
  • 按从左到右解析字符串,覆盖无小数点、无数字等各类输入场景

示例输入输出

输入字符串期望输出
*$234.345234.34
(9.9)9.9
$34.455r.4r45,45.4534.45
2023-05-29 03:40:11Z, License: CC BY-SA 4.0202305290340114.0
9.95,6.432,0.39.95
po2iaw5e.ro1i7im8jjks;fl32;i.u12ma25.17
oias25.spkks25.
45454545
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:24:54