提取字符串中全部数字最推荐用preg_match_all('/\d+/', $str, $matches)获取连续数字块,如['123','45','6789','0'];若需单字符数字则用/\d/;str_split+is_numeric效率低且破坏多位数结构。

要提取字符串中全部数字,最直接有效的方法是用正则表达式 preg_match_all() 匹配连续的数字片段。
用 preg_match_all 提取所有数字(推荐)
该函数能一次性找出字符串中所有符合模式的子串,并存入数组。匹配数字用模式 /\d+/(匹配一个或多个连续数字):
-
// 示例字符串
$str = "abc123def45gh6789ijk0"; -
// 提取所有数字块(保留多位数完整性)
preg_match_all('/\d+/', $str, $matches);
$numbers = $matches[0]; // ['123', '45', '6789', '0'] -
// 若需转为整数数组
$integers = array_map('intval', $numbers); // [123, 45, 6789, 0]
只取单个数字字符(不含多位数)
如果题目要求“每个数字字符单独提取”(如 "a1b22c3" → ['1','2','2','3']),改用 /\d/:
-
preg_match_all('/\d/', $str, $matches);
$digits = $matches[0]; // 每个字符独立
用 str_split + is_numeric 过滤(不推荐但易理解)
逐字符判断虽直观,但会丢失多位数结构,且效率低:
立即学习“PHP免费学习笔记(深入)”;
-
$chars = str_split($str);
$digits = array_filter($chars, 'is_numeric');
$digits = array_values($digits); // 重排索引 - 结果是单字符数组,无法区分 "12" 和 "1","2"
注意常见陷阱
- 别用 filter_var($str, FILTER_SANITIZE_NUMBER_INT) —— 它会删掉非数字字符但保留负号和小数点,且不能分离数字块
- 避免用 intval() 直接转换整个字符串,它只取开头数字,如 intval("abc123") = 0
- 中文数字(一、二、三)不属于 \d,需额外映射处理,本题通常不涉及



















