所以我知道使用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个地方。
答案 0 :(得分:6)
为什么不是这样的?
/^(?:100|\d{1,2})(?:\.\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),然后可选择一个点后跟两位数。