正则表达式验证数字0-100最多两位小数

时间:2011-10-18 15:52:13

标签: php regex preg-match

所以我知道使用php is_numeric函数会更容易,但我要做的是创建一个正则表达式,主要用于学习正则表达式,以测试测试分数。范围可以是0-100,但可以有2个小数位。这就是我到目前为止所做的工作。

  if (preg_match("^([0-9]){2,3})(.[0-9]{2})?$([0-9]{1})?$", $quiz1))
    {
        echo "match";
    }
    else {
        $error = true;
    }

如果我正确地思考字面含义:

字符串的开始查找字符0-9,两个地方。 字符串十进制的可选结尾,并找到两个地方的字符0-9。 可选的字符串结尾查找字符0-9,为1个地方。

3 个答案:

答案 0 :(得分:6)

为什么不是这样的?

 /^(?:100|\d{1,2})(?:\.\d{1,2})?$/
  • ^ - 字符串的开头
  • (?:100 | \ d {1,2}) - 非捕获组,100或0-99
  • (?:\。d {1,2})? - 可选的非捕获组(。#或。##)
  • $ - 字符串结尾

结果:

  

php> $ tests = array(0,5,10,50,100,99.5,75.43,75.436,101);

     

php> foreach($ tests as $ test){print $ test。 “ - ”。 preg_match(“/ ^(?:100 | \ d {1,2})(?:\。\ d {1,2})?$ /”,$ test)。 “\ n” 个; }

     

0 - 1

     

5 - 1

     

10 - 1

     

50 - 1

     

100 - 1

     

99.5 - 1

     

75.43 - 1

     

75.436 - 0

     

101 - 0

     

75F43 - 0

即使我添加了斜杠并删除了额外的),您的工作也无效。

  

php> foreach($ tests as $ test){print $ test。 “ - ”。   preg_match(“/ ^([0-9] {2,3})(。[0-9] {2})?$([0-9] {1})?$ /”,$ test)。 “\ n” 个; }   0 - 0

     

5 - 0

     

10 - 1

     

50 - 1

     

100 - 1

     

99.5 - 0

     

75.43 - 1

     

75.436 - 0

     

101 - 1

     

75F43 - 1

答案 1 :(得分:3)

答案 2 :(得分:1)

gpojd的回答是正确的。但是,这就是你的正则表达式无效的原因。

首先,你想要()里面的第一个$。因为否则它将需要匹配字符串的结尾,然后再在字符串结尾之后再次匹配,这当然是不可能的。

其次,点角色需要成为\。因为一个点本身匹配任何字符,但你想要一个实际的点。最后,你需要分隔符,就像别人建议的那样。这是你的正则表达式匹配的内容:

首先,两位或三位数,强制性。 然后,任意字符后跟两位数字。 然后,字符串的结尾,强制。 然后,一个数字,可选。 然后,再次强制结束字符串。

既然你是一名程序员,就很难习惯正则表达式的思维方式;你习惯于用if-else语句来思考,但是正则表达式并没有真正起作用。

同样,上面的选项已经足够了,但如果我要为此写一个正则表达式,我会说:

/^100(.00)?|([1-9]?[0-9])(\.[0-9]{2})?$/

因此,要么100后跟可选的.00,要么:首先是可选的非零数字,然后是强制数字(数字为0到99),然后可选择一个点后跟两位数。

相关问题