我试图识别字符串中的“数字”,但标记它是什么类型的数字,例如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 ";
}
无论如何,它回声“CARDINAL”。
是的,我尝试过切换订单(卡/通用先,然后是其他)。 是的,我已经尝试将它们作为独立的IF()s,并且以相反的顺序(最常见的是第一个)。
似乎没有任何效果。 即使单个IF检查任何格式也只是失败。 我的规则都被塞满了 - 或者我做了一些明显错误的事情。
答案 0 :(得分:2)
尝试使用^
和$
围绕每个正则表达式,以便只有匹配整个字符串或行时才匹配。如果没有这些,如果正则表达式匹配数字的一部分,那么这仍然是匹配。例如,'1,000'
匹配CARDINAL数字的正则表达式/([-+]?)([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%"
));
输出:
CARDINAL GENERAL GENERAL GENERAL RATIO RATIO RATIO FRACTION PERCENTILE PERCENTILE PERCENTILE
编辑:对于CARDINAL数字,这可能是一个更好的正则表达式:
/^([-+]?)([0-9]+)(?:,?[0-9]{3})*([.]?)$/
答案 1 :(得分:2)
你的错误必须来自其他地方,我无法重现它。尝试将您的代码放在一个空的文件中以自行测试它,它应该可以正常工作。
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
答案 2 :(得分:0)
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