0

0

php如何从字符串中提取数字?PHP字符串提取数字技巧

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-09-19 12:11:01

|

851人浏览过

|

来源于php中文网

原创

使用preg_match_all配合正则表达式/-?\d+(.\d+)?/可精准提取字符串中所有整数和浮点数,包括负数,是处理混合数字格式的首选方法。

php如何从字符串中提取数字?php字符串提取数字技巧

从PHP字符串中提取数字,最灵活和强大的方式无疑是利用正则表达式。它能应对从简单整数到复杂浮点数、甚至混杂在文本中的多种数字格式。当然,针对一些特定、简单的场景,PHP也提供了其他辅助函数,但要论通用性和精确度,正则几乎是首选。

解决方案

要从字符串中提取数字,我们通常会用到PHP的

preg_replace
preg_match_all
函数。

如果你只是想把字符串中所有非数字字符“清理”掉,只留下数字,

preg_replace
非常方便:

但如果你的目标是识别并提取出字符串中一个个独立的数字(无论是整数还是浮点数,包括负数),那么

preg_match_all
才是主力。这能让你得到一个包含所有匹配数字的数组。

立即学习PHP免费学习笔记(深入)”;

 12345
    [1] => 123.45
    [2] => -6
    [3] => 8
    [4] => 25.5
)
*/

// 如果你只关心整数,可以简化正则表达式
preg_match_all('/\d+/', $text, $integers);
print_r($integers[0]);
/*
Array
(
    [0] => 12345
    [1] => 123
    [2] => 45
    [3] => 6
    [4] => 8
    [5] => 25
    [6] => 5
)
*/
?>

从我的经验来看,

preg_match_all
配合合适的正则表达式,几乎能解决所有从字符串中提取数字的需求。关键在于你对“数字”的定义——是纯整数、带小数的浮点数、还是需要考虑负号?

PHP如何精准提取字符串中的所有整数或浮点数?

要精准地从字符串中分离出整数或浮点数,正则表达式的选择至关重要。这不仅仅是技术上的选择,更是对业务逻辑的理解。

对于整数,模式相对简单,我们通常关注连续的数字序列。

/\d+/
这个模式就能很好地捕捉到字符串中所有连续的数字串。例如,从“用户ID: 1001, 订单号: 20230501”中,它会分别提取出“1001”和“20230501”。如果你需要考虑负整数,那么模式需要调整为
/-?\d+/
,这样
-5
也能被正确识别。但要注意,如果字符串是
--5
,它可能只会匹配到第一个
-
5
,这取决于正则引擎的具体行为和你的预期。

而对于浮点数,情况就复杂一些。一个浮点数可能包含一个可选的负号、整数部分、一个小数点以及小数部分。一个比较全面的模式是

/-?\d+(\.\d+)?/
。这个模式的含义是:

  • -?
    :匹配一个可选的负号(0次或1次)。
  • \d+
    :匹配一个或多个数字(整数部分)。
  • (\.\d+)?
    :匹配一个可选的小数部分。
    \.
    匹配字面上的小数点,
    \d+
    匹配小数点后一个或多个数字。整个
    (\.\d+)?
    表示这个小数部分是可选的。

举个例子,

"商品价格:19.99元,折扣:-5.5%,库存:100个"
,使用
/-?\d+(\.\d+)?/
,就能准确地提取出
19.99
-5.5
100
。但如果字符串中出现像
.5
(即没有整数部分的浮点数),这个模式就无法匹配。为了更健壮,可以考虑
/[+-]?(\d*\.)?\d+/
,它能匹配
123
123.45
.5
-10
+20
等多种形式。但通常,实际应用中我们遇到的浮点数都有整数部分。

在实际操作中,我发现很多时候人们会忽略数字的上下文。比如,从“温度25.5摄氏度”中提取

25.5
是浮点数,但从“版本号1.2.3”中提取
1.2.3
,这可能并不是一个单纯的浮点数,而是由点分隔的多个数字。这时候,你可能需要更精确的模式,或者分步提取。

10分钟内自己学会PHP
10分钟内自己学会PHP

10分钟内自己学会PHP其中,第1篇为入门篇,主要包括了解PHP、PHP开发环境搭建、PHP开发基础、PHP流程控制语句、函数、字符串操作、正则表达式、PHP数组、PHP与Web页面交互、日期和时间等内容;第2篇为提高篇,主要包括MySQL数据库设计、PHP操作MySQL数据库、Cookie和Session、图形图像处理技术、文件和目录处理技术、面向对象、PDO数据库抽象层、程序调试与错误处理、A

下载

处理包含多种数字格式的字符串时,PHP有哪些高效策略?

当字符串中混杂了多种数字格式,比如整数、浮点数、甚至可能带有千位分隔符的数字,高效的策略并不仅仅是写一个复杂的正则表达式,更重要的是策略组合和后处理

一个常见的场景是,你可能需要从一段描述性文字中抓取所有看起来像钱数、数量或ID的数字。我的做法通常是:

  1. 宽泛匹配,然后精细筛选: 首先,用一个相对宽泛的正则表达式(例如

    /-?\d+(,\d{3})*(\.\d+)?/
    ,这个能匹配带逗号千位分隔符的数字)来捕获所有可能的数字候选。

    $text = "订单总额:$1,234.56,数量:100个,折扣:-15%,ID: 987654321。";
    preg_match_all('/[+-]?\d+(?:,\d{3})*(?:\.\d+)?/', $text, $matches);
    $raw_numbers = $matches[0];
    print_r($raw_numbers);
    /*
    Array
    (
        [0] => 1,234.56
        [1] => 100
        [2] => -15
        [3] => 987654321
    )
    */

    然后,对这些捕获到的字符串进行后处理。例如,去除千位分隔符,并转换为实际的数字类型:

    $cleaned_numbers = array_map(function($num_str) {
        // 移除逗号,然后转换为浮点数或整数
        $num_str = str_replace(',', '', $num_str);
        return is_numeric($num_str) ? (strpos($num_str, '.') !== false ? (float)$num_str : (int)$num_str) : null;
    }, $raw_numbers);
    $cleaned_numbers = array_filter($cleaned_numbers, fn($val) => $val !== null); // 移除转换失败的null
    print_r($cleaned_numbers);
    /*
    Array
    (
        [0] => 1234.56
        [1] => 100
        [2] => -15
        [3] => 987654321
    )
    */

    这种分两步走的方式,比试图用一个超级复杂的正则表达式一次性解决所有问题要清晰和健壮得多。

  2. 根据上下文选择不同模式: 如果数字的格式与其在字符串中的位置或前缀相关,可以考虑使用命名捕获组分段匹配。例如,你可能知道“金额”后面跟着的是货数字,而“数量”后面跟着的是整数。

    $text = "金额:123.45元,数量:10个。";
    if (preg_match('/金额:(\d+\.\d+)元/', $text, $match_amount)) {
        echo "金额: " . (float)$match_amount[1] . "\n";
    }
    if (preg_match('/数量:(\d+)个/', $text, $match_quantity)) {
        echo "数量: " . (int)$match_quantity[1] . "\n";
    }
    // 输出:
    // 金额: 123.45
    // 数量: 10

    这种方法在处理结构化程度较高但又嵌入在文本中的数据时非常有效。它避免了提取出所有数字后还需要猜测哪个数字代表什么的问题。

除了正则表达式,PHP还有其他提取数字的方法吗?适用场景是?

当然有,虽然它们在灵活性和强大程度上不如正则表达式,但在特定、简单的场景下,它们也能派上用场。

  1. filter_var()
    函数: PHP的
    filter_var()
    函数,配合
    FILTER_SANITIZE_NUMBER_INT
    FILTER_SANITIZE_NUMBER_FLOAT
    过滤器,可以用来清理字符串中的非数字字符。

    • FILTER_SANITIZE_NUMBER_INT
      :会从字符串中移除所有非数字字符,只留下整数数字、加号和减号。
      $text = "用户ID: ABC123DEF456";
      $id = filter_var($text, FILTER_SANITIZE_NUMBER_INT);
      echo "提取整数:" . $id; // 输出:123456
    • FILTER_SANITIZE_NUMBER_FLOAT
      :会移除所有非数字字符,但会保留数字、加号、减号以及小数点和科学计数法符号(
      e
      e
      )。
      $text = "价格: $123.45元";
      $price = filter_var($text, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
      echo "提取浮点数:" . $price; // 输出:123.45

      适用场景:当你需要从一个字符串中提取唯一一个清理整个字符串以使其只包含数字时,

      filter_var
      非常方便。例如,从用户输入中清理电话号码、邮政编码或简单的价格。它的局限性在于,如果字符串中包含多个不相关的数字,它会把它们拼接起来,或者只提取第一个能被解析的数字,这可能不是你想要的。比如“订单123,数量456”,
      filter_var
      会得到“123456”。

  2. 手动遍历字符: 这是一种更底层的方法,你可以遍历字符串中的每一个字符,然后使用

    ctype_digit()
    或简单的比较来判断它是否是数字。

    $text = "Hello123World456";
    $numbers = '';
    for ($i = 0; $i < strlen($text); $i++) {
        if (ctype_digit($text[$i])) {
            $numbers .= $text[$i];
        }
    }
    echo "手动遍历提取:" . $numbers; // 输出:123456

    适用场景:这种方法在处理非常短的字符串,或者当你需要极度精细控制哪些字符可以被视为数字时(例如,只允许ASCII数字,不允许全角数字),可能会有用。但它非常低效,且难以处理浮点数、负数或多个独立数字的提取,代码量也会相对较大。

总的来说,虽然

filter_var
和手动遍历在某些简单场景下能提供解决方案,但它们在面对复杂性、多样性和精确度要求时,都显得力不从心。正则表达式的强大之处在于其模式匹配的能力,能让你以声明式的方式定义“数字”的形态,从而应对绝大多数字符串数字提取的挑战。因此,我的建议是,优先考虑正则表达式,并在其不能完美解决时,再考虑结合其他函数进行辅助处理。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

1993

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1318

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1221

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1400

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1229

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1440

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

62

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号