Как я могу проверить число без знака в PHP? - PullRequest
4 голосов
/ 03 апреля 2011

Я не уверен, как справиться с этим, и я попробовал, какие для меня самые очевидные решения, но до сих пор ни один не оказался полностью удовлетворительным.Я должен пропустить что-то очень простое.

У меня есть форма с вводом типа текста:

<input type="text" name="album_id">

Я хочу проверить ввод, чтобы пользователи вводили только целое число без знака ...

$required = array(); // required or invalid input

$tmp = trim($_POST['album_id']);

if (!is_int((int)$tmp)) {
   $required['album'] = 'The album id must contain a positive numeric value only.';
}

Пока что я использую !is_numeric($tmp), но пользователь может ввести 9.2 или '1e4', и он подтвердит ..., чтобы он не работал.

IЯ также пытался !is_int((int)$tmp), но по какой-то причине он не работает (возможно, так и должно быть, но я делаю это неправильно ...).Я пытался ctype_digit безуспешно.Я, вероятно, что-то пропускаю, но не уверен, что.

Как я могу проверить число без знака в php?Нет чисел с плавающей запятой, отрицательных чисел и т. Д. ... только простое число без знака (от 1 до n).

Ответы [ 4 ]

7 голосов
/ 03 апреля 2011

Если вы хотите проверить, содержит ли какая-либо переменная только цифры (что, по-видимому, здесь вам нужно) , вам, вероятно, придется перейти с ctype_digit().


Не уверен, что вы пытались, но что-то вроде этого должно работать:

$tmp = trim($_POST['album_id']);
if (ctype_digit($tmp)) {
    // $tmp only contains digits
}
4 голосов
/ 03 апреля 2011

Функция filter_var() является подходящим инструментом для работы здесь.

Вот фильтр, который будет возвращать non-false только для целых чисел без знака или целочисленных строк без знака:

$filteredVal = filter_var($inputVal, 
                          FILTER_VALIDATE_INT, 
                          array('options' => array('min_range' => 0)));

Вот документация о фильтрах .

Пример:

<?php

$testInput = array(
            "zero string" => "0",
            "zero" => 0,
            "int" => 111,
            "string decimal" => "222",
            "empty string" => "",
            "false" => false,
            "negative int" => -333,
            "negative string decimal" => "-444",
            "string octal" => "0555",
            "string hex" => "0x666", 
            "float" => 0.777,
            "string float" => "0.888",
            "string" => "nine"
         ); 

foreach ($testInput as $case => $inputVal)
{
    $filteredVal = filter_var($inputVal, 
                              FILTER_VALIDATE_INT, 
                              array('options' => array('min_range' => 0)));

    if (false === $filteredVal)
    {
        print "$case (". var_export($inputVal, true) . ") fails\n";
    } 
    else
    { 
        print "$case (". var_export($filteredVal, true) . ") passes\n";
    }
}

Выход:

zero string (0) passes
zero (0) passes
int (111) passes
string decimal (222) passes
empty string ('') fails
false (false) fails
negative int (-333) fails
negative string decimal ('-444') fails
string octal ('0555') fails
string hex ('0x666') fails
float (0.777) fails
string float ('0.888') fails
string ('nine') fails
1 голос
/ 03 апреля 2011
if (preg_match('!^[1-9][0-9]*$!',$tmp)) {
1 голос
/ 03 апреля 2011

Вы можете использовать preg_match():

if(preg_match('/^[\\d+]$/', $tmp) == 0)
    $required['album'] = 'The album id must ...';

Обратите внимание, что это не будет делать проверку положительного диапазона (например, превышение максимально допустимого значения целого числа).

Edit: Используйте решение Pascal MARTIN, если вы не хотите выполнять более сложные проверки (например, требовать другие специальные символы), так как я предполагаю, что оно обеспечивает более высокую производительность для этого использования.

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