HOWTO · PHP

如何在 PHP 中从字符串中提取数字

本文介绍了如何在 PHP 中从字符串中提取数字。它包括 preg_match_all()函数,filter_var()函数和 preg_replace()函数。

本页内容

要从 PHP 字符串中提取数字,应根据所需结果选择方法:分别获取各段数字、得到保留数字和正负号的清理后字符串,或得到只包含 ASCII 数字的字符串。以下示例使用相同输入,便于比较不同结果。提取字符不等于解析小数或验证数值。

使用 preg_match_all() 捕获每段数字

如果要将每段连续数字分别作为一个匹配结果,请使用 preg_match_all()。模式决定哪些内容算作匹配;\d+ 会查找一个或多个连续数字。该函数返回匹配的数量,第三个参数则通过 $matches[0] 接收捕获的文本(如果有捕获组,也会将其放在其他条目中)。因此,返回值是匹配数量,而不是提取出的值。

运行以下示例。本节中的代码以及显示的标签或输出仍为英文。

<?php
$input = 'Invoice A-42: total $18.50; item 7.';
$count = preg_match_all('/\d+/', $input, $matches);
echo "count=$count\n";
echo implode(', ', $matches[0]), "\n";
?>
count=4
42, 18, 50, 7

每段连续数字都会单独返回,因此 18.50 中的小数点会将文本拆成 18 和 50。这种方法适合查找数字片段,但不会判断它们代表整数、小数、日期还是标识符。如果周围文本的格式很重要,请使用更具体的模式。

使用 filter_var() 保留整数字符

filter_var() 与 FILTER_SANITIZE_NUMBER_INT 配合使用,可以在一个字符串中保留整数字符,包括加号和减号。它会删除其他字符,但不会分别提取多个值,也不会验证剩余内容是否为格式正确的整数。由于所有符合条件的符号都会保留,输入中其他位置的符号也可能出现在结果中。

本节中的代码以及显示的标签或输出仍为英文。

<?php
$input = 'Invoice A-42: total $18.50; item 7.';
$sanitized = filter_var($input, FILTER_SANITIZE_NUMBER_INT);
echo $sanitized, "\n";
?>
-4218507

A-42 中的减号会保留,而小数分隔符会被删除,使 18 和 50 连在一起。在应用程序检查预期格式并确定如何解释结果之前,应将其保留为文本。将任意清理后的文本强制转换为整数,可能掩盖格式错误并丢失信息,因此不能替代解析或验证。

使用 preg_replace() 删除非数字字符

将 preg_replace() 与 /[^0-9]/ 配合使用,可以将 ASCII 数字范围以外的每个字符替换为空字符串。结果是一个字符串,原本被其他字符隔开的数字段也会连在一起。此模式会删除正负号、小数标点、空白字符和字母;只有在这些字符不应影响结果时才适合使用。

本节中的代码以及显示的标签或输出仍为英文。

<?php
$input = 'Invoice A-42: total $18.50; item 7.';
$digits = preg_replace('/[^0-9]/', '', $input);
echo $digits, "\n";
?>
4218507

这里的 [^0-9] 表示不属于十个 ASCII 数字之一的任意字符。结果会保留数字的顺序,但会丢弃数值之间的边界:42、18、50 和 7 会变成 4218507。这种方法适合从标识符中保留数字字符等任务,但不适合还原原始数值。该模式也不匹配非 ASCII 数字字符。

根据输入格式选择方法

如果需要将每段数字分别作为一个值,请选择 preg_match_all()。如果需要一个保留数字和正负号的字符串,请将 filter_var() 与 FILTER_SANITIZE_NUMBER_INT 配合使用,并在解释结果前验证其格式。如果期望结果是只包含 ASCII 数字的单个字符串,而且有意将分隔开的数字段连在一起,请选择 preg_replace()。

这些操作都不会解析小数:preg_match_all() 会在标点处分段,而清理字符的方法会删除小数点。如果小数、千位分隔符或带符号数字必须保留原有含义,应先定义并验证相应的输入格式,再进行转换。同样,/[^0-9]/ 有意只保留 ASCII 数字;如果输入可能包含其他数字形式,请使用适合实际字符集的模式。应根据输入是普通文本、格式化数值还是标识符,以及分隔符和正负号是否有意义来选择方法。