上一篇
场景引入:
你有没有遇到过这样的问题?从一段混杂着文字、符号的字符串里,只想把数字单独拎出来,比如用户填了个电话号码"138-1234-5678",但数据库只接受纯数字"13812345678";或者爬虫抓取商品价格时,面对"¥199.5"这样的文本,如何快速提取"199.5"?这时候,PHP的正则表达式就是你的"数字捕手"。
在PHP中,主要用preg_match()
和preg_match_all()
两个函数配合正则表达式实现数字提取:
// 单次匹配(返回第一个匹配到的数字) preg_match('/\d+/', $string, $matches); // 全局匹配(返回所有数字) preg_match_all('/\d+/', $string, $matches);
关键符号说明:
\d
:匹配任意数字(0-9) $matches
数组 $text = "订单号:20250715"; preg_match('/\d+/', $text, $match); echo $match[0]; // 输出:20250715
$price = "特价:¥99.9元"; preg_match('/\d+\.?\d*/', $price, $match); echo $match[0]; // 输出:99.9
$phone = "客服:400-810-1234"; preg_match_all('/\d/', $phone, $matches); echo implode('', $matches[0]); // 输出:4008101234
$code = "验证码:2468 有效期5分钟"; preg_match('/\b\d{4}\b/', $code, $match); echo $match[0]; // 输出:2468
$sci = "测量值:1.23e+5"; preg_match('/-?\d+\.?\d*e[+-]?\d+/i', $sci, $match); echo $match[0]; // 输出:1.23e+5
$size = "文件大小:256MB"; preg_match('/(\d+)(\w+)/', $size, $match); print_r($match); // 输出:Array ( [0]=>256MB [1]=>256 [2]=>MB )
贪婪匹配问题:
// 错误示范:会匹配整个"123-456" preg_match('/\d+.*\d+/', "电话123-456", $match); // 正确做法:用非贪婪模式 preg_match('/\d+?/', "电话123-456", $match);
中文数字干扰:
// 排除"一百二十三"这类中文数字 preg_match('/[^\d一二三四五六七八九十百千万亿]/u', $text);
性能优化:
str_replace()
更快 $pattern = '/\d+/'; preg_match($pattern, $text, $match);
function cleanNumber($input) { // 移除所有非数字字符(保留小数点) $cleaned = preg_replace('/[^\d\.]/', '', $input); // 处理多个小数点的情况 if (substr_count($cleaned, '.') > 1) { $pos = strpos($cleaned, '.'); $cleaned = substr($cleaned, 0, $pos + 1) . str_replace('.', '', substr($cleaned, $pos + 1)); } return $cleaned; } echo cleanNumber("价格:¥1,234.56元"); // 输出:1234.56
:
PHP正则匹配数字就像精准的筛子,通过调整\d
、、等符号的组合,可以应对各种数字提取需求,记住先明确你的数字特征(是否含小数点、是否需要分隔符等),再设计对应的正则表达式,最后别忘了用preg_match
系列函数执行匹配。
(本文方法基于PHP 8.2版本验证,2025年7月仍适用)
本文由 卞忆曼 于2025-07-29发表在【云服务器提供商】,文中图片由(卞忆曼)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://up.7tqx.com/wenda/475097.html
发表评论