应先用正则提取首个数字片段再转整型:preg_match('/[-+]?\d+.?\d*/', $str, $m) 获取数字,filter_var($m[0], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION) 清洗,最后(int)round((float)$cleaned)转整。

PHP 中带单位字符串怎么安全提取数字转整型
直接用 (int) 或 intval() 强转带单位的字符串(如 "123px"、"45.6kb")会出错或截断不准确——PHP 会在遇到第一个非数字字符时停止解析,但小数点、负号、科学计数法等会让结果不可控。真正可靠的做法是先用正则精准提取数字部分,再转整型。
用 preg_match() 提取最前面连续数字(含负号和小数点)
多数场景要的是“开头的数值”,比如 "-123.45px" → -123(转整型后自动舍小数),这时正则应聚焦数字起始段:
-
preg_match('/^[-+]?\d*\.?\d+/', $str, $matches)可匹配带符号、可选小数点的数字前缀 - 但注意:它会把
"123.45px"匹配成"123.45",(int)"123.45"得123,没问题;而"abc123"则完全不匹配,返回false - 如果字符串总是「数字在前 + 单位在后」,这个模式足够用;否则得换更宽松的提取逻辑
用 preg_replace() 清洗所有非数字字符(慎用)
有人习惯用 preg_replace('/[^0-9\-\.]/', '', $str) 把所有非数字字符干掉,再强转。这看似简单,但极易翻车:
-
"width: 100px; height: 200px;"→ 变成"100200",完全失真 -
"-5.5°C"→"-5.5"还行,但"1e3kg"会被清成"1e3",而(int)"1e3"是1(PHP 不识别科学计数法字符串转 int) - 单位里带连字符(如
"2x3")、负号(如"−10℃"使用全角减号)也会漏判
推荐组合:正则找首个有效数字 + filter_var() 安全转整型
兼顾健壮与语义,建议分两步走:
立即学习“PHP免费学习笔记(深入)”;
- 用
preg_match('/[-+]?\d+\.?\d*/', $str, $m)找第一个数字片段(不强制开头,跳过前导非数字符) - 拿到
$m[0]后,用filter_var($m[0], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND)做二次清洗(防异常字符干扰) - 最后用
(int)round((float)$cleaned)转整型——显式转 float 再 round,避免"123.9"直接(int)截断成123
真正难处理的是多数值混排(如 "min:10,max:20")或 Unicode 单位(如全角数字、中文单位),这些必须按业务规则定制正则,没有通用解法。











