【问题标题】:preg_match: trying to identify number formatspreg_match:尝试识别数字格式
【发布时间】:2011-09-29 12:06:21
【问题描述】:

我不仅要识别字符串中的“数字”,还要标记它是什么类型的数字,例如 General、Fraction、Percentile、Ratio 等。

现在,如果我使用像 http://rubular.com/ 这样的工具,我的模式似乎可以正常工作。

规则?

([-+]?)([0-9]+)([,+]?)([.]?)       //General
([-+]?[0-9.,]+[%])                 //Percent
([0-9]+[\/][0-9]+(?:st|nd|rd|th))  //Fraction
([-+]?[0-9.,]+[:][-+]?[0-9.,]+)    //Ratio  

要检查的字符串?

1  
1,000  
1.000  
-50.5  
-1:+3  
1,200.6:3.9  
+2:-4  
1/5th  
25%  
25.76%  
1,001%  

当我将它们放入 php (if/elseif) 构造时,我总是以“一般”数字结束?

if (preg_match('/([-+]?[0-9.,]+[%])/',$string)) {
    echo " PERCENTILE ";

} elseif (preg_match('/([0-9]+[\/][0-9]+(?:st|nd|rd|th))/',$string)) {
    echo " FRACTION ";

} elseif (preg_match('/([-+]?[0-9.,]+[:][-+]?[0-9.,]+)/',$string)) {
    echo " RATIO ";

} elseif (preg_match('/([-+]?)([0-9]+)([,+]?)([.]?)/',$string)) {
    echo " CARDINAL ";

} else {
    echo " GENERAL ";
}

无论如何,它都在呼应“红衣主教”。

是的,我尝试过切换顺序(首先是卡/一般,然后是其他)。 是的,我尝试让它们独立 IF(),并以相反的顺序(最一般的优先)。

似乎没有任何效果。 即使是对任何格式的 Single IF 检查也会失败。 要么我的规则被塞满了——要么我做错了什么。

【问题讨论】:

  • 对我来说很好:codepad.viper-7.com/UU7Tw4
  • 谢谢。它是现有代码的一部分......所以其他地方正在导致问题(不知道如何/为什么)。
  • 好吧......我想我可能已经找到了我的问题......“字符串”的值不是我的脚本中应该有的值(它将它分解为一个初始整数) . -- 就是说……如果没有你们的帮助,我永远也想不通,所以非常感谢你们!
  • 更新:谢谢大家 - 我得到了它的工作。非常感谢,他们现在都有 ^$ 并再次进行了测试。

标签: php regex numbers preg-match


【解决方案1】:

您的错误一定来自其他地方,我无法重现它。尝试将您的代码放在一个空文件中以自行测试它应该可以正常工作。

Test.php:

$nums = array(
  '1',
  '1,000',
  '1.000',
  '-50.5',
  '-1:+3',
  '1,200.6:3.9',
  '+2:-4',
  '1/5th',
  '25%',
  '25.76%',
  '1,001%'
);
foreach ($nums as $string) {
  echo $string.': ';
  if (preg_match('/([-+]?[0-9.,]+[%])/',$string)) {
    echo " PERCENTILE ";
  } elseif (preg_match('/([0-9]+[\/][0-9]+(?:st|nd|rd|th))/',$string)) {
    echo " FRACTION ";
  } elseif (preg_match('/([-+]?[0-9.,]+[:][-+]?[0-9.,]+)/',$string)) {
    echo " RATIO ";
  } elseif (preg_match('/([-+]?)([0-9]+)([,+]?)([.]?)/',$string)) {
    echo " CARDINAL ";
  } else {
    echo " GENERAL ";
  }
  echo "\n";
}

$ php test.php

1:  CARDINAL 
1,000:  CARDINAL
1.000:  CARDINAL
-50.5:  CARDINAL
-1:+3:  RATIO 
1,200.6:3.9:  RATIO
+2:-4:  RATIO 
1/5th:  FRACTION 
25%:  PERCENTILE
25.76%:  PERCENTILE 
1,001%:  PERCENTILE

【讨论】:

  • 谢谢(NullUserException ఠ_ఠ 也指出了这一点)。啊,好吧 - 现在我需要拖网/重新排列我现有的代码,看看问题发生在什么/哪里。
【解决方案2】:

尝试用^$ 包围每个正则表达式,以便它仅在匹配整个字符串或行时才匹配。没有这些,如果正则表达式匹配数字的一部分,那么它仍然是匹配的。例如,'1,000' 匹配您的基数正则表达式 /([-+]?)([0-9]+)([,+]?)([.]?)/,因为它匹配子字符串 '1,'。如果添加^$,如/^([-+]?)([0-9]+)([,+]?)([.]?)$/,则不再匹配。

<?php
function check_format($string) {
    if (preg_match('/^([-+]?[0-9.,]+[%])$/',$string)) {
        echo " PERCENTILE ";

    } elseif (preg_match('/^([0-9]+[\/][0-9]+(?:st|nd|rd|th))$/',$string)) {
        echo " FRACTION ";

    } elseif (preg_match('/^([-+]?[0-9.,]+[:][-+]?[0-9.,]+)$/',$string)) {
        echo " RATIO ";

    } elseif (preg_match('/^([-+]?)([0-9]+)([,+]?)([.]?)$/',$string)) {
        echo " CARDINAL ";

    } else {
        echo " GENERAL ";
    }
}

array_map("check_format", array(
    "1",
    "1,000",
    "1.000",
    "-50.5",
    "-1:+3",
    "1,200.6:3.9",
    "+2:-4",
    "1/5th",
    "25%",
    "25.76%",
    "1,001%"
    ));

输出:

基数 一般 一般 比率 比率 分数 百分位 百分位 百分位

编辑:这可能是基数的更好的正则表达式:

/^([-+]?)([0-9]+)(?:,?[0-9]{3})*([.]?)$/

【讨论】:

  • 谢谢。它似乎可以在没有 ^$ 框架的情况下自行运行,但无论如何这是个好建议!
【解决方案3】:
Please have a look on this .

<?php 
$num = 12.20

$num = floatval(preg_replace('/[^\d.]/', '', num));

// output will be 12.2

//it always replace zero and you have number 12.00 then output will be 12
$num = 12.00

$num = floatval(preg_replace('/[^\d.]/', '', num));
// output will be 12

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多