所以我知道使用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,用于两个位置。
为什么不这样呢?
/^(?:100|'d{1,2})(?:'.'d{1,2})?$/
- ^ -字符串的开头
- (?:100|'d{1,2}) -非捕获组,100或0-99
- (?:。' d {1,2}) ?-可选非抓包组。# or .##)
- $ -结束字符串
结果:
php> $测试=阵列(0、5、10、50、100,99.5,75.43,75.436,101年),
php> foreach ($test作为$test){打印$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
即使我添加斜杠并删除额外的)
,您的也不起作用。
php> foreach ($test作为$test){打印$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
0
75.43 - 1
75.436 - 0
101 - 1
用/
字符包围表达式
gpojd的答案正确。然而,这就是为什么你的正则表达式不能工作。
首先,第一个$要放在()里面。因为否则它将需要匹配字符串的末尾,然后再匹配字符串的末尾,这当然是不可能的。
第二,点字符需要变成'。因为点本身可以匹配任何字符,但你需要一个真正的点。最后,您需要分隔符,就像其他人建议的那样。以下是您的regex匹配的内容:
第一个,两位或三位数字,必选。然后,任意后跟两位数字的字符,可选。然后,字符串结束,强制。然后,一个数字,可选。然后,再次返回字符串的末尾,强制。
既然你是一个程序员,你可能很难习惯正则表达式的思维方式;你习惯用if-else语句来思考,但是正则表达式并不是这样的。
同样,上面的选项已经足够好了,但是如果我要为此写一个正则表达式,我会写:
/^100(.00)?|([1-9]?[0-9])('.[0-9]{2})?$/
所以,要么100后面跟着一个可选的。00,要么:首先是一个可选的非零数字,然后是一个必选的数字(这些数字使数字0到99),然后是一个可选的点后面跟着两个数字。