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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

513

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

251

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

745

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

214

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

351

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

236

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

532

2023.12.06

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

31

2026.01.28

热门下载

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

精品课程

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

共137课时 | 9.9万人学习

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

共6课时 | 11.2万人学习

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

共13课时 | 0.9万人学习

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

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