2011-02-11 147 views
1

我想要一個模式來創建一個「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 
+1

你錯過了一個$。 – BoltClock 2011-02-11 19:56:06

+0

這也是有效的,is_id(0)你有它顯示//錯誤 – 2011-02-11 20:00:19

+0

當然有一個函數來確定一個值是否看起來像一個數字;應該沒有必要爲此構造一個正則表達式。 – Ether 2011-02-11 20:03:46

回答

4

您在模式中遺漏了尾隨$。在is_id(1.5)您的模式匹配1並停止。如果添加尾部$(如^[0-9]+$),則該模式需要匹配整個輸入才能成功。

6

$表示行/字符串匹配的結束。

/^[0-9]+$/ 
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的答案。

1

爲什麼使用正則表達式?爲什麼不籤類型(這不是作爲正則表達式爲微小的,但它可能是更合適的語義)

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

is_numeric()驗證它要麼浮子,一個int,或數比可以轉換。

floor($n) == $n檢查它是否確實是一個整數。

$n > 0檢查,看它是否大於0

做...