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

如何正确提取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.

图片转代码服务由CSDN问答提供 功能建议

我在PHP中有一个字符串,我只想提取整数和十进制数,这是一个例子:

 &lt;?php 
 
 $ string ='Maríaviveen un pueblo de 25 957 habitantes y cobra 1859 euros al mes。  OJO:没有sésososbéisfijado,perolosnúmerosdelúltimoempmplo
no llevan un punto o una coma separando los millares(25.957 o 1.859)。  Ségain结果extraño,pero la nueva normativa de la R.A.E.  
dice quelosnúmerosdecuatro cifrasNOllevarándislaración(1859)ylosnúmerosdecinco cifrasomásNillevánnipuntos ni comas,
sinounaplalaración(25 957 o 1 343 392)。  El 94%delosniñoshatraídolosdeberes hechos。 他是pagado $50,95dólares。'; 
 
?&gt; 
   
 
 

在这种情况下,我尝试使用此行获取数字: \ n

  $ numbers = preg_replace('/ [^ 0-9 \。,] /','',$ string); 
   
 
 <  p>但问题是结果是: 
 
 
  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 
   
 
 

我该如何解决?

我希望得到您的帮助。 \ n

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

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
    )
    */
    
    点赞 评论
  • dousha7645 2019-08-16 23:15

    Use this regular expression:

    (\d*\.)?\d+
    

    NOTE
    This exp will match 25 957 like 2 matches (for the space between numbers).

    点赞 评论
  • donglin1192 2019-08-16 23:47

    Probably not the most elegant way to do it but you could use two preg_replace functions based on your first REGEX and remove the decimals without any numbers wrapped around them like so :

    $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"
    

    Live example here : https://3v4l.org/9aUCt

    点赞 评论

相关推荐 更多相似问题