Подтвердить что ты не робот

Php проверить, является ли переменная целой

Есть ли лучший способ сделать это?

if( $_POST['id'] != (integer)$_POST['id'] )
    echo 'not a integer';

Я пробовал

if( !is_int($_POST['id']) )

Но is_int() по какой-то причине не работает.

Моя форма выглядит как

<form method="post">
   <input type="text" name="id">
</form>

Я исследовал is_int(), и кажется, что если

is_int('23'); // would return false (not what I want)
is_int(23);   // would return true

Я также пробовал is_numeric()

is_numeric('23'); // return true
is_numeric(23); // return true
is_numeric('23.3'); // also returns true (not what I want)

кажется, что единственный способ сделать это: [это плохо, не делайте этого, см. примечание ниже)

if( '23' == (integer)'23' ) // return true
if( 23 == (integer)23 ) // return true
if( 23.3 == (integer)23.3 ) // return false
if( '23.3' == (integer)'23.3') // return false

Но есть ли функция, чтобы сделать выше?


Чтобы уточнить, мне нужны следующие результаты

23     // return true
'23'   // return true
22.3   // return false
'23.3' // return false

Примечание. Я только что понял, что мое предыдущее решение, которое я представил, вернет true для всех строк. (спасибо redreggae)

$var = 'hello';
if( $var != (integer)$var )
    echo 'not a integer';

// will return true! So this doesn't work either.

Это не дубликат Проверка, является ли переменная целой в PHP, потому что мои требования/определения целого отличаются от theres.

4b9b3361

Ответ 1

попробуйте ctype_digit

if (!ctype_digit($_POST['id'])) {
    // contains non numeric characters
}

Примечание. Он будет работать только с типами string. Таким образом, вы должны использовать string свои обычные переменные:

$var = 42;
$is_digit = ctype_digit((string)$var);

Также обратите внимание: он не работает с отрицательными целыми числами. Если вам это нужно, вам придется идти с регулярным выражением. Я нашел этот, например:

EDIT: Благодаря LajosVeres, я добавил модификатор D. Так что 123\n недействительно.

if (preg_match("/^-?[1-9][0-9]*$/D", $_POST['id'])) {
    echo 'String is a positive or negative integer.';
}

Подробнее: простой тест с кастингом не будет работать, поскольку "php" == 0 is true и "0" === 0 is false! См. таблицу сравнений для этого.

$var = 'php';
var_dump($var != (int)$var); // false

$var = '0';
var_dump($var !== (int)$var); // true

Ответ 2

попробуйте filter_var функцию

filter_var($_POST['id'], FILTER_VALIDATE_INT);

использование:

if(filter_var($_POST['id'], FILTER_VALIDATE_INT)) { 
    //Doing somethings...

}

Ответ 3

В PHP $_POST значения всегда являются текстовыми (string type).

Вы можете принудительно ввести переменную в целочисленный тип следующим образом:

$int_id = (int)$_POST['id'];

Это будет работать, если вы уверены, что $_POST['id'] должно быть целым числом. Но если вы хотите абсолютно убедиться, что он содержит только цифры от 0 до 9, и никакие другие знаки или символы не используются:

if( ctype_digit( $_POST['id'] ) )
{
  $int_id = (int)$_POST['id'];
}

Ответ 4

Проверьте это: http://php.net/manual/en/function.ctype-digit.php - он проверяет, содержит ли строка только цифры, поэтому обязательно не передавайте int этой функции как он скорее всего вернет ложь; Однако все значения, исходящие от $_POST, всегда являются строками, поэтому вы в безопасности. Также он не будет проверять отрицательное число, например -18, поскольку - не является цифрой, но вы всегда можете сделать ctype_digit(ltrim($number, '-'))

is_int проверяет переменную тип, которая в вашем случае string; он будет таким же, как (integer)$v === $v, поскольку == выполняет некоторые реальные неясные вещи, чтобы сравнить две переменные другого типа; вы всегда должны использовать ===, если вы не хотите, чтобы mess, как "0af5gbd" == 0, возвращал true

Также имейте в виду, что ctype_digit не скажет вам, действительно ли строка может быть преобразована в действительный int, поскольку максимальное целочисленное значение PHP_INT_MAX; Если ваше значение больше, вы все равно получите PHP_INT_MAX.

Ответ 5

preg_match('/^\d+$/D',$variable) //edit 

Ответ 6

если вы знаете, что это строковая переменная (например, post o get values), вы можете использовать:

function is_really_integer($var) {
  return $var == (string)(integer)$var;
}

Ответ 7

Принятый ответ с использованием ctype_digit является правильным, однако вы можете облегчить жизнь с помощью функции. Это будет скрывать переменную до строки, поэтому вам не нужно:

function is_num($x){
    if(!is_string($x)){
        $x=(string)$x;
    }
    if(ctype_digit($x)){
      return true;
    }
    return false;
}

Использование:

if (is_num(56)) {
    // its a number
}

if (is_num('56')) {
    // its a number
}

Если вы хотите принять десятичные знаки, используйте это:

function is_num($x){
    if(!is_string($x)){
        $x=(string)$x;
    }    
    if (strpos($x,'.')!==false) {      
        if(substr_count($x,'.')>1||strpos($x,'.')<1||strpos($x,'.')>=strlen($x)){
            return false;    
        }
        $x=str_replace('.','',$x);    
    }
    if(ctype_digit($x)){
        return true;
    }  
    return false;
}

Ответ 8

Используйте следующую универсальную функцию для проверки всех типов:

function is_digit($mixed) {
    if(is_int($mixed)) {
        return true;
    } elseif(is_string($mixed)) {
        return ctype_digit($mixed);
    }

    return false;
}

Ответ 9

Я использую:

is_int($val)||ctype_digit($val)

Обратите внимание, что этот catch только положительные целые строки

Ответ 10

Использование is_numeric() для проверки того, является ли переменная целой, является плохой идеей. Эта функция отправит TRUE для 3.14, например. Это не ожидаемое поведение

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

Учитывая этот массив переменных:

$variables = [
    "TEST 0" => 0,
    "TEST 1" => 42,
    "TEST 2" => 4.2,
    "TEST 3" => .42,
    "TEST 4" => 42.,
    "TEST 5" => "42",
    "TEST 6" => "a42",
    "TEST 7" => "42a",
    "TEST 8" => 0x24,
    "TEST 9" => 1337e0
];

Первый вариант (FILTER_VALIDATE_INT Way):

# Check if your variable is an integer
if( ! filter_var($variable, FILTER_VALIDATE_INT) ){
  echo "Your variable is not an integer";
}

Выход:

TEST 0 : 0 (type:integer) is not an integer ✘
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔

Второй вариант (способ CASTING COMPARISON):

# Check if your variable is an integer
if ( strval($variable) != strval(intval($variable)) ) {
  echo "Your variable is not an integer";
}

Выход:

TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔

Третий вариант (путь CTYPE_DIGIT):

# Check if your variable is an integer
if( ! ctype_digit(strval($variable)) ){
  echo "Your variable is not an integer";
}

Выход:

TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔

Четвертый вариант (путь REGEX):

# Check if your variable is an integer
if( ! preg_match('/^\d+$/', $variable) ){
  echo "Your variable is not an integer";
}

Выход:

TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔

Ответ 11

is_int отлично работает, нет необходимости в дополнительном коде

или вы можете проверить с помощью is_numeric