Php 正则表达式验证数字0-100,最多保留两位小数
所以我知道只使用php is_numeric函数会更容易,但我正在尝试创建一个正则表达式,主要用于学习regex,以测试分数。范围可以是0-100,但可以有2位小数。这是我到目前为止所做的,它不起作用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; } 如果我正确
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>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>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、 学习元语言