Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_match:尝试识别数字格式_Php_Regex_Numbers_Preg Match - Fatal编程技术网

Php preg_match:尝试识别数字格式

Php preg_match:尝试识别数字格式,php,regex,numbers,preg-match,Php,Regex,Numbers,Preg Match,我试着不仅识别字符串中的“数字”,还要标记它是什么类型的数字,比如一般数字、分数、百分位数、比率等等 现在,如果我使用像这样的工具,我的模式似乎工作得很好 规则 ([-+]?)([0-9]+)([,+]?)([.]?) //General ([-+]?[0-9.,]+[%]) //Percent ([0-9]+[\/][0-9]+(?:st|nd|rd|th)) //Fraction ([-+]?[0-9.,]+[:][-+]?[0-9.,]+)

我试着不仅识别字符串中的“数字”,还要标记它是什么类型的数字,比如一般数字、分数、百分位数、比率等等

现在,如果我使用像这样的工具,我的模式似乎工作得很好

规则

([-+]?)([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
)结构中时,我总是以“general”数字结束

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()s,并以相反的顺序(最常见的是第一次)

似乎什么都不管用。 即使是单个IF检查任何一种格式都会失败。
要么我的规则被填满了,要么我在做一些明显错误的事情。

尝试用
^
$
包围每个正则表达式,使其仅在匹配整个字符串或行时匹配。没有这些,如果正则表达式匹配一个数字的一部分,那么这仍然是一个匹配。例如,
'1000'
匹配基数的正则表达式,
/([-+])([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%"
    ));

尝试用
^
$
包围每个正则表达式,使其仅在匹配整个字符串或行时匹配。没有这些,如果正则表达式匹配一个数字的一部分,那么这仍然是一个匹配。例如,
'1000'
匹配基数的正则表达式,
/([-+])([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%"
    ));

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

Test.php:

$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

你的错误一定来自别的地方,我无法重现。试着把你的代码放在一个空文件中,单独测试它,它应该可以正常工作

Test.php:

$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
请看一下这个。
请看一下这个。

对我来说很好:谢谢。它是现有代码的一部分。。。所以其他地方的东西正在引起问题(不知道如何/为什么)。好吧。。。我想我可能已经解决了我的问题。。。“string”的值不是脚本中应该的值(它将其分解为单个初始整数)也就是说。。。如果没有你们的帮助,我永远也想不到,所以非常感谢你们!更新:谢谢大家-我让它工作了。非常感谢,他们现在都已经^$并且再次测试。对我来说效果很好:谢谢。它是现有代码的一部分。。。所以其他地方的东西正在引起问题(不知道如何/为什么)。好吧。。。我想我可能已经解决了我的问题。。。“string”的值不是脚本中应该的值(它将其分解为单个初始整数)也就是说。。。如果没有你们的帮助,我永远也想不到,所以非常感谢你们!更新:谢谢大家-我让它工作了。非常感谢,他们现在都已经^$并且再次接受了测试。谢谢。在没有^$框架的情况下,它似乎可以自己工作,但无论如何,这是一个很好的建议!谢谢你。在没有^$框架的情况下,它似乎可以自己工作,但无论如何,这是一个很好的建议!谢谢你(NullUserException)ఠ_ఠ 他也指出了这一点)。啊,好吧,现在我需要拖网/重新排列我的退出代码,以查看问题发生的地方。谢谢(NullUserException)ఠ_ఠ 他也指出了这一点)。啊,好吧,现在我需要拖网/重新安排我的退出代码,看看问题发生在哪里。
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
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