使用 preg_match_all 提取字符串中所有数字,核心做法是调用该函数并传入正则表达式 /\d+/ 作为模式。执行后,结果数组的第二个索引(即 $matches[1])将包含所有匹配到的独立数字序列。如果希望获取单个字符而非连续数字串,可将模式改为 /[0-9]/。

preg_match_all 返回的数据结构是怎样的
该函数返回匹配的总次数,并将结果填充到第三个参数引用变量中。默认情况下,$matches 是一个二维数组:索引 0 存储所有完整匹配项,索引 1 存储第一个捕获组的匹配项。由于 /\d+/ 没有显式捕获组,完整匹配项直接位于 $matches[0] 中。若使用带括号的模式如 (\d+),则结果会出现在 $matches[1] 中,而 $matches[0] 依然保留完整匹配内容。

<?php $string = "Order #12345 for item A-678 and B-90"; $pattern = "/\d+/"; $count = preg_match_all($pattern, $string, $matches); // $matches[0] contains all full matches: ['12345', '678', '90'] // $count is 3 print_r($matches[0]); ?>
运行上述代码,$matches[0] 的输出为:
Array
(
[0] => 12345
[1] => 678
[2] => 90
)
如何仅提取单个数字字符而非连续数字串
当需要拆分连续数字为独立字符时,应将正则模式从 /\d+/ 调整为 /[0-9]/ 或 /\d/g(注意 PHP 不支持 g 修饰符,需用 /[0-9]/)。此模式下,每个数字字符被视为一次独立匹配,从而在结果数组中生成更多元素。例如,字符串 "123" 在使用 /\d+/ 时匹配为 ["123"],而使用 /[0-9]/ 时匹配为 ["1", "2", "3"]。
立即学习“PHP免费学习笔记(深入)”;

<?php $string = "Phone: 123-456-7890"; $singleDigitPattern = "/[0-9]/"; preg_match_all($singleDigitPattern, $string, $singleMatches); print_r($singleMatches[0]); ?>
运行结果:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
[9] => 0
)
当字符串中包含负数或小数时,/\d+/ 会如何处理
正则表达式 /\d+/ 仅匹配连续的数字字符,不包含符号或小数点。因此,对于输入 "-12.34",该模式会分别匹配出 "12" 和 "34",忽略负号和点号。若需完整提取负数和小数,应使用更复杂的模式如 /-?\d+\.?\d*/。但需注意,此模式可能匹配不完整的小数(如 "-.5"),实际应用中建议结合业务逻辑验证数值有效性。



















