正则表达式(避免浮点数)

时间:2011-02-11 19:54:47

标签: php regex floating-point numbers pattern-matching

我想要一个模式来创建一个“is_id()”函数来验证mysql查询之前的用户输入。模式大多数只包含数字,我的问题是避免浮点数:

function is_id($id) {          
    $pattern = "/^[0-9]+/";      
        if(preg_match($pattern,$id)) {      
            echo "ok";      
        } else {      
            echo "error";       
        }    
} 


is_id(0) // error  
is_id(-5) // error  
is_id(-5.5) // error  
is_id(1.5) // ok <-- THIS IS THE PROBLEM  
is_id(10) // ok  
is_id("5") // ok  
is_id("string") // error

4 个答案:

答案 0 :(得分:6)

$表示要匹配的行/字符串的结尾。

/^[0-9]+$/

答案 1 :(得分:4)

您错过了模式中的尾随$。在is_id(1.5)中,您的模式与1匹配并停止。如果您添加尾随$(如^[0-9]+$中所示),则模式将需要匹配整个输入才能成功。

答案 2 :(得分:1)

你不需要正则表达式,你可以使用这样的简单检查:

function is_id($id)
{
    return ((is_numeric($id) || is_int($id)) && !is_float($id)) && $id > -1
}

输出如下:

var_dump(is_id(0));        // false - are we indexing from 0 or 1 ?
var_dump(is_id(-5));       // false
var_dump(is_id(-5.5));     // false
var_dump(is_id(1.5));      // false
var_dump(is_id(10));       // true
var_dump(is_id("5"));      // true
var_dump(is_id("string")); // false

我赞成ircmaxell的回答。

答案 3 :(得分:1)

为什么要使用正则表达式?为什么不检查类型(这不像正则表达式那么小,但它可能在语义上更合适)

function is_id($n) {
    return is_numeric($n) && floor($n) == $n && $n > 0;
} 

is_numeric()验证它是float,int还是可以转换的数字。

floor($n) == $n检查它是否确实是一个整数。

$n > 0检查它是否大于0.

完成...