Регулярное выражение (избегайте чисел с плавающей точкой) - PullRequest
1 голос
/ 11 февраля 2011

Я хочу, чтобы шаблон создал функцию 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 ]

6 голосов
/ 11 февраля 2011

$ обозначает конец строки / строки для сопоставления.

/^[0-9]+$/
4 голосов
/ 11 февраля 2011

Вы пропустили трейлинг $ в вашем паттерне.В is_id(1.5) ваш шаблон соответствует 1 и останавливается.Если вы добавите трейлинг $ (как в ^[0-9]+$), тогда шаблон должен соответствовать всему входу, чтобы преуспеть.

1 голос
/ 11 февраля 2011

Зачем использовать регулярное выражение? Почему бы не проверить типы (это не так крошечно, как регулярное выражение, но может быть более семантически уместным)

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

is_numeric() проверяет, что это может быть либо число с плавающей точкой, целое число или число, которое можно преобразовать.

floor($n) == $n проверяет, является ли оно целым числом.

$n > 0 проверяет, является ли оно больше 0.

Совершено ...

1 голос
/ 11 февраля 2011

Для этого вам не нужно регулярное выражение, вы можете использовать простую проверку следующим образом:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...