php 8.0+ 应用 str_contains((string)$num, '7') 判断整数是否含某数字,语义准确、性能最优、规避负数/零/溢出等边界问题;php 7.x 则用 strpos((string)$num, '7') !== false。

用 str_contains() 最快最安全
PHP 8.0+ 直接转字符串查,比数学拆解快得多,也避开了负数、前导零、溢出等一堆边界问题。整型本身不“包含数字”,真正要的是“十进制表示里有没有某字符”,所以字符串匹配才是语义正确的做法。
-
str_contains((string)$num, '7')—— 简洁、可读、无副作用 - 别用
strpos((string)$num, '7') !== false:多写且易漏!== false(0也是合法位置) - 负数如
-42转成字符串是"-42",若不想匹配负号,先取绝对值:str_contains((string)abs($num), '4') - 注意:
0是有效整数,(string)0是"0",能正常匹配
PHP 7.x 必须用 strpos() 模拟 str_contains()
低版本没 str_contains(),但不能退化成 strstr() 或正则——前者返回子串开销大,后者更重。就用 strpos(),只是务必用全等判断。
-
strpos((string)$num, '3') !== false—— 唯一推荐写法 - 错例:
if (strpos(...)):当目标数字在首位(如512查'5'),返回0,被当成false - 错例:
strpos(...) !== -1:虽然等价,但 PHP 官方文档明确用false描述失败,保持一致更稳妥 - 避免
in_array()拆数组:把整数转成 digit 数组再查,性能差且代码臃肿
别碰数学拆解:% 和 floor() 很容易翻车
有人想用取余、除法逐位提取数字,逻辑上可行,但实际几乎总是错的——尤其遇到 0、负数、PHP_INT_MIN 这类边界值时行为反直觉。
-
0:任何对0取余或除法操作都需单独判断,否则循环直接跳过 - 负数:
-123 % 10在 PHP 中是-3,不是7,得额外处理符号 - 大数:
floor($num / 10)对超大整数可能因浮点精度丢失最后几位(即使$num是 int) - 性能:字符串转换是 O(1) 内置操作;数学拆解是 O(log n),还要手动写循环
正则 preg_match() 不必要,除非你要复杂模式
单纯查“是否含某个数字”,正则纯属杀鸡用牛刀。它启动慢、编译开销固定、还引入 PCRE 依赖风险。
立即学习“PHP免费学习笔记(深入)”;
- 正确但冗余:
preg_match('/7/', (string)$num) - 如果需求升级为“含两个连续 7”或“以 9 结尾”,再考虑正则
- 注意:不要写
preg_match('/^7$/', ...)——这是匹配“整个数等于 7”,不是“包含 7” - 线上高频调用场景下,
str_contains()比preg_match()快 3–5 倍(实测 PHP 8.2)
真正要注意的其实是隐式类型转换和负号处理——很多人只测了正数,上线后遇到 -1024 或 0 就漏匹配。字符串方案本身很简单,但得想清楚“你要的到底是数字字符,还是数值意义上的构成”。











