我有一个使用Ajax发送到PHP的等级变量,我想验证该变量。
等级从0.5
到5
,因此可能的接受值为0.5, 1, 1.5, 2, .. 5
。
我正在尝试使用Regular Expressions
进行检查:
$var = 0.5;
$pattern = '/^[0-9]|[0-9.][0-9]$/';
if( ! preg_match($pattern, $var) ){
echo 'Doesn't match!';
}else{
echo 'Matches!';
}
但这会检查任何数字,或者像1, 0.2, 10000, 1000.99
这样的十进制。
那么如何将其限制为仅检查0.5, 1, 1.5, .. 5
?
答案 0 :(得分:2)
只需查找数字0-4
和可选的.5
或5
。
^(?:[0-4](\.5)?|5)$
演示:https://regex101.com/r/Bcsl6d/1/
...或者如果0
无效,请执行与5
相同的操作。
^(?:0\.5|[1-4](\.5)?|5)$
说明:
您的正则表达式:
^[0-9]|[0-9.][0-9]$
^[1-9]|[1-9.][1-9]$
只是在寻找一个数字,或者一个数字或.
和一个数字。您需要字符类an之外的.
是可选的,然后您需要.
之后的数字只能是5并且也是可选的。 0-9
也太大,您确实想要1-5
,但是在该范围之后您不能执行可选的.5
,因为它将使5.5
有效。
您还可以为此range
和in_array
使用2个PHP函数。 range
的第三个参数是增加值的步骤。
$values = range(.5, 5, .5);
if(in_array('5', $values)) {
echo 'valid number';
} else{
echo 'invalid';
}
答案 1 :(得分:1)
您可以使用此正则表达式将.5
到5
之间的数字进行匹配,并在结尾加上.0
作为可选字符,例如4.0
和4
都将被验证:
^(?:[1-4](?:\.[05])?|0?\.5|5(?:\.0)?)$
RegERx详细信息:
^
:开始(?:
:启动非捕获组
[1-4](?:\.[05])?
:将数字1.0
与4.5
匹配,并在结尾加上.0
可选|
:或0?\.5
:匹配0.5
或.5
|
:或5(?:\.0)?
:匹配5
或5.0
)
:结束非捕获组$
:结束答案 2 :(得分:1)
或者因为您只有十个可能的值,所以对于那些以后不得不看一下代码并实际尝试理解它们的人而言:
$valid = ['0.5', '1', '1.5', '2', ...];
if (!in_array($var, $valid)) {
// invalid value given.
}
无需使用复杂的正则表达式来验证简单的内容。