使用 preg_match_all 配合正则表达式 /\d+/ 可以提取字符串中所有连续的数字序列。该函数会返回一个包含所有匹配子串的数组,自动忽略非数字字符。

preg_match_all 如何区分连续与非连续数字
正则表达式中的 \d+ 表示匹配一个或多个连续的数字字符。当输入字符串中包含被非数字字符隔开的数字时,preg_match_all 会将它们视为独立的匹配项分别提取。例如,在字符串 "abc123def456" 中,123 和 456 是两组连续的数字,因此会被分别提取为两个独立的元素,而不会合并为一个结果。

<?php
$input = "abc123def456ghi789";
preg_match_all('/\d+/', $input, $matches);
print_r($matches[0]);
?>预期输出:
立即学习“PHP免费学习笔记(深入)”;
Array
(
[0] => 123
[1] => 456
[2] => 789
)如何处理包含小数点的数字提取
如果需求是将小数也视为连续数字的一部分,可以使用正则表达式 /\d+\.?\d*/ 或更严格的 /\d+(?:\.\d+)?/。前者会匹配整数和小数,后者确保小数点前后都有数字。默认情况下,\d+ 不会匹配小数点,因为小数点不属于数字字符类。若需保留小数结构,需调整正则模式以包含小数点符号,从而将 "12.34" 视为一个整体而非 "12" 和 "34"。

<?php
$input = "price is 12.34 and quantity 5";
preg_match_all('/\d+(?:\.\d+)?/', $input, $matches);
print_r($matches[0]);
?>预期输出:
立即学习“PHP免费学习笔记(深入)”;
Array
(
[0] => 12.34
[1] => 5
)基于输入 "test123!@#456" 的具体提取结果
对于输入字符串 "test123!@#456",使用 preg_match_all('/\d+/', $input, $matches) 将提取出 "123" 和 "456" 两个连续数字序列。特殊字符 "!@#" 作为分隔符,导致数字被分割为独立部分。最终结果为数组 ['123', '456'],符合只提取连续数字的要求。



















