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

Php 正则表达式验证数字0-100,最多保留两位小数,php,regex,preg-match,Php,Regex,Preg Match,所以我知道只使用php is_numeric函数会更容易,但我正在尝试创建一个正则表达式,主要用于学习regex,以测试分数。范围可以是0-100,但可以有2位小数。这是我到目前为止所做的,它不起作用 if (preg_match("^([0-9]){2,3})(.[0-9]{2})?$([0-9]{1})?$", $quiz1)) { echo "match"; } else { $error = true; } 如果我正确

所以我知道只使用php is_numeric函数会更容易,但我正在尝试创建一个正则表达式,主要用于学习regex,以测试分数。范围可以是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个位置。

/
字符环绕表达式


/
字符环绕表达式


为什么不做这样的事情呢

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

php>$tests=array(0,5,10,5010099.5,75.43,75.436101)

php>foreach($tests作为$test){print$test.-“.preg\u 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作为$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


为什么不像这样

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

php>$tests=array(0,5,10,5010099.5,75.43,75.436101)

php>foreach($tests作为$test){print$test.-“.preg\u 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作为$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


gpojd的答案是正确的。然而,以下是您的正则表达式不起作用的原因

  if (preg_match("^([0-9]){2,3})(.[0-9]{2})?$([0-9]{1})?$", $quiz1))
    {
        echo "match";
    }
    else {
        $error = true;
    }
首先,您需要()中的第一个$。因为否则它将需要匹配字符串的结尾,然后在之后再次匹配字符串的结尾,这当然是不可能的

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

第一,两位或三位数字,必填。 然后,任意字符后跟两位数字(可选)。 然后,字符串的末尾是必填项。 然后,选择一位数字。 然后,字符串的结尾再次出现,强制

因为你是一个程序员,很难习惯正则表达式的思维方式;你习惯于用if-else语句来思考问题,但是正则表达式并不是这样工作的

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

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

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

gpojd的答案是正确的。然而,以下是您的正则表达式不起作用的原因

  if (preg_match("^([0-9]){2,3})(.[0-9]{2})?$([0-9]{1})?$", $quiz1))
    {
        echo "match";
    }
    else {
        $error = true;
    }
首先,您需要()中的第一个$。因为否则它将需要匹配字符串的结尾,然后在之后再次匹配字符串的结尾,这当然是不可能的

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

第一,两位或三位数字,必填。 然后,任意字符后跟两位数字(可选)。 然后,字符串的末尾是必填项。 然后,选择一位数字。 然后,字符串的结尾再次出现,强制

因为你是一个程序员,很难习惯正则表达式的思维方式;你习惯于用if-else语句来思考问题,但是正则表达式并不是这样工作的

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

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

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

您的正则表达式存在语法错误和元字符滥用。如果你打算使用正则表达式(我强烈建议你这么做),你需要花一些时间学习(神秘的)语法。i、 e.学习元字符(在字符类内部和外部是不同的,顺便说一句),并使用交互工具(如或)练习、练习、练习。有很好的免费教程可以让你有一个好的开始,例如,你的正则表达式有语法错误和元字符滥用。如果你打算使用正则表达式(我强烈建议你这么做),你需要花一些时间学习(神秘的)语法。i、 学习元语言