为了账号安全,请及时绑定邮箱和手机立即绑定

如何正确提取PHP字符串中的整数和十进制数?

如何正确提取PHP字符串中的整数和十进制数?

PHP
慕的地8271018 2021-11-26 16:33:21
我在 PHP 中有一个字符串,我只想提取整数和十进制数,这是一个例子:<?php $string = 'María vive en un pueblo de 25 957 habitantes y cobra 1859 euros al mes. OJO: no sé si os habéis fijado, pero los números del último ejemplo no llevan un punto o una coma separando los millares (25.957 o 1.859). Sé que resulta extraño, pero la nueva normativa de la R.A.E. dice que los números de cuatro cifras NO llevarán separación (1859) y los números de cinco cifras o más NO llevarán ni puntos ni comas, sino una separación (25 957 o 1 343 392). El 94% de los niños ha traído los deberes hechos. He pagado $50,95 dólares.';?>在这种情况下,我尝试使用此行获取数字:$numbers = preg_replace('/[^0-9\.,]/', ' ', $string);但问题是结果是:25 957 1859 . , 25.957 1.859 . , . . . 1859 , 25 957 1 343 392 . 94 . 50,95 .   我想得到这个结果:25 957 1859 25.957 1.859 1859 25 957 1 343 392 94 50,95我该如何解决?我想得到你的帮助。
查看完整描述

3 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

您使用 a.表示千位和 a,表示小数,看起来您的文本是供人类使用的,因此在 a.和之前总会有一个数字,。


因此,您想要的是 1 个或多个数字,然后是 0 个或多个千组(a.后跟 3 个以上的数字),可选地后跟一个,和一个或多个数字。


One or more numbers: [0-9]+

0 or more thousand-groups: (\.[0-9]{3})*

Optionally a `,` and one or more numbers: (,[0-9]+)?

综合: [0-9]+(\.[0-9]{3})*(,[0-9]+)?


$string = 'María vive en un pueblo de 25 957 habitantes y cobra 1859 euros al mes. OJO: no sé si os habéis fijado, pero los números del último ejemplo 

no llevan un punto o una coma separando los millares (25.957 o 1.859). Sé que resulta extraño, pero la nueva normativa de la R.A.E. 

dice que los números de cuatro cifras NO llevarán separación (1859) y los números de cinco cifras o más NO llevarán ni puntos ni comas, 

sino una separación (25 957 o 1 343 392). El 94% de los niños ha traído los deberes hechos. He pagado $50,95 dólares.';


$matches = [];

preg_match_all('/[0-9]+(\.[0-9]{3})*(,[0-9]+)?/', $string, $matches);


print_r($matches[0]);


/*

Array

(

    [0] => 25

    [1] => 957

    [2] => 1859

    [3] => 25.957

    [4] => 1.859

    [5] => 1859

    [6] => 25

    [7] => 957

    [8] => 1

    [9] => 343

    [10] => 392

    [11] => 94

    [12] => 50,95

)

*/


查看完整回答
反对 回复 2021-11-26
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

使用这个正则表达式:

(\d*\.)?\d+

注意
此 exp 将匹配25 9572 个匹配项(用于数字之间的空格)。


查看完整回答
反对 回复 2021-11-26
?
哔哔one

TA贡献1854条经验 获得超8个赞

可能不是最优雅的方法,但您可以使用基于您的第一个 REGEX 的两个 preg_replace 函数并删除小数而不用任何数字包裹它们,如下所示:


$numbers = preg_replace('/[^0-9\.,]+/', ' ', $string);

$decimals = preg_replace('/([^0-9][\.,])/', '', $numbers);

var_dump($decimals); // string(56) " 25 957 1859 25.957 1.859 1859 25 957 1 343 392 94 50,95"

现场示例:https : //3v4l.org/9aUCt


查看完整回答
反对 回复 2021-11-26
  • 3 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信