doufen3838 2019-08-16 23:05
浏览 141
已采纳

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

I have a string in PHP where I want to extract only integer and decimal numbers, this is an example:

<?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.';

?>

In this case I try to get numbers using this line:

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

But the problem is the result is:

25 957 1859 . , 25.957 1.859 . , . . . 1859 , 25 957 1 343 392 . 94 . 50,95 .   

And I want to get this result:

25 957 1859 25.957 1.859 1859 25 957 1 343 392 94 50,95

How can I fix it?

I'd like your help.

  • 写回答

3条回答 默认 最新

  • doq1969 2019-08-16 23:25
    关注

    You're using a . for thousands and a , for decimals, and it looks like your text is intended for humans so there will always be a number immediately before a . and ,.

    So what you want is 1 or more numbers, followed by 0 or more thousand-groups (a . followed by 3 more numbers), optionally followed by exactly one , and one or more numbers.

    One or more numbers: [0-9]+
    0 or more thousand-groups: (\.[0-9]{3})*
    Optionally a `,` and one or more numbers: (,[0-9]+)?
    

    Combined: [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
    )
    */
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3