filter_var验证整数必须配options选项,否则默认不识别负数和0;需显式设置min_range/max_range才能支持全范围整数,且调用前须trim()处理空白。

filter_var 判断整数的正确用法
直接用 FILTER_VALIDATE_INT 就行,但必须配 options 才能可靠识别负数和零——默认不认负号,也不认 0(会当成 false)。
常见错误是只写 filter_var($val, FILTER_VALIDATE_INT),结果 -5 返回 false,0 也返回 false,误判成非法。
- 必须显式传入
['options' => ['min_range' => PHP_INT_MIN, 'max_range' => PHP_INT_MAX]]才支持全范围整数 - 如果只要非负整数,可设
'min_range' => 0;只要正整数,设'min_range' => 1 -
filter_var对字符串"123"、"-456"、"0"都返回对应整数;对"12.3"、"abc"、"123 "(尾部空格)返回false
为什么不能只靠 is_int() 或 ctype_digit()
is_int() 只认 PHP 原生 integer 类型,而表单或 JSON 来的数据全是 string,它永远返回 false;ctype_digit() 只认纯数字字符串,不认负号,"-123" 直接挂。
所以别混用:is_int() 是类型检查,filter_var() 是字符串校验,二者场景完全不同。
立即学习“PHP免费学习笔记(深入)”;
-
is_int("123")→false(字符串不是 int) -
ctype_digit("-123")→false(含负号) -
filter_var("-123", FILTER_VALIDATE_INT, ['options' => ['min_range' => -1000]])→-123(正确)
注意 trim() 和空字符串陷阱
filter_var 对首尾空白敏感:" 123 "、"\t0\n" 全部返回 false,它不做自动 trim。
- 务必在调用前手动
trim(),尤其处理 $_POST 或 $_GET 数据时 - 空字符串
""、null、false都会返回false,但"0"在正确配置下返回0(注意:0 是合法整数) - 示例安全写法:
$int = filter_var(trim($input), FILTER_VALIDATE_INT, ['options' => ['min_range' => PHP_INT_MIN, 'max_range' => PHP_INT_MAX]]) !== false ? (int)$input : null;
和 intval() 的关键区别在哪
intval() 是强制转换,"123abc" 会截出 123,"abc123" 得 0,完全没校验逻辑;filter_var 是严格验证,任何多余字符都失败。
- 要“取数字部分”用
intval()或正则;要“确认整个值是合法整数”才用filter_var -
intval("123px")→123(危险!可能掩盖输入污染) -
filter_var("123px", FILTER_VALIDATE_INT)→false(正确拦截) - 性能上
intval()快得多,但安全性和语义完全不同,别因为快就乱换
真正容易被忽略的是:不设 min_range/max_range 时,FILTER_VALIDATE_INT 实际只接受 0 到 2147483647(32 位平台),超出就失效——哪怕你传的是 "2147483648" 这种纯数字字符串,也会默默返回 false。



















