2010-04-08 6 views
1

Как проверить и посмотреть, вводит ли пользователь только числа и длиной не менее 4 чисел, используя PHP?Вопрос о проверке PHP

+1

Прежде всего, напишите свой код; http://www.php.net - отличная ссылка. –

+2

@TaG, это кажется немного неуместным. –

+0

Люди RTFQ! По некоторым причинам много небрежных ответов на этот вопрос. – notJim

ответ

5

Вы можете использовать регулярное выражение:

/^\d{4,}$/ 

Пример использования:

$s = "7325"; 
if (preg_match('/^\d{4,}$/', $s)) { 
    echo "matches"; 
} 
+2

Который вы можете проверить с помощью 'preg_match()' –

+0

@Alexandre Jasmin, спасибо :) – TaG

+0

@Alexandre: Хорошо. Я добавил примерный код. –

0

У вас есть пример кода, чтобы начать?

Чтобы строго ответить на ваш вопрос, вы можете использовать регулярное выражение, например if(preg_match('/^\d{4,}$/', $input)....

Но здесь еще многое нужно рассмотреть: вам нужно рассмотреть как проверку, так и фильтрацию (и лучше всего сохранить две отдельные проблемы). Если вы строго проверяете целое число, то я полагаю, что вы в безопасности от SQL-инъекций, XSS и т. Д., Но вам действительно нужно иметь дескриптор этих проблем, потому что рано или поздно вам нужно будет фильтровать & проверять что-то, отличное от простого целого.

+0

intval ('0000') равно 0, что будет недействительным для вас, даже если это четыре цифры и имеет длину 4 или больше. – notJim

6

предложение Марка Байерс это хорошо, но вот еще один способ:

$valid = ctype_digit($number) && strlen($number) >= 4; 
+1

Мне это нравится, потому что (как и у Марка) '0123' соответствует условию, а механизм регулярных выражений не используется. – webbiedave

+0

@notJim, ты выиграл мой голос, потому что ты самый результативный :) –

1

ctype_digit() & & StrLen() выигрывает

<?php 

function benchmark($callback){ 
    echo sprintf('%-30s: ', $callback); 
    $t = microtime(true); 
    foreach(range(1, 10000) as $n){ 
    call_user_func($callback); 
    } 
    echo (microtime(true)-$t)."\n"; 
} 

function mark_byers_preg_match(){ 
    $s = "7325"; 
    preg_match('/^\d{4,}$/', $s); 
} 

function notjim_ctype_digit_strlen(){ 
    $number = 7325; 
    ctype_digit($number) && strlen($number) >= 4; 
} 

function tomalak_intval_broken(){ 
    $check = 7325; 
    intval($check) == $check && $check >= 1000 && $check <= 9999; 
} 

benchmark('mark_byers_preg_match'); 
benchmark('notjim_ctype_digit_strlen'); 
benchmark('tomalak_intval_broken'); 

?> 

Результаты

mark_byers_preg_match   : 0.029040098190308 
notjim_ctype_digit_strlen  : 0.026585817337036 
tomalak_intval_broken   : 0.019872903823853 

Примечание: @ Томалак не делает т работа с числами, начиная с 0 поэтому не квалифицируется


Edit: @ раствор kiethjgrant был удален из-intval(0000) вычисляется как false, когда он должен быть true.

+0

с номерами рядом, победителей нет. Кроме того, поскольку OP сказал, это пользовательский ввод, все входные данные будут строками. – Gordon

+0

Я ценю усилия, но это мать всех бессмысленных, преждевременных микрооптимизаций. – notJim

+0

@notJim, как «мать всех бессмысленных» и «преждевременных», являются спорными точками. Иногда результаты сильно различаются, и для копирования/вставки решений в скрипт потребовалось около 2 минут. Какой вред? –

0

вы должны всегда использовать наиболее эффективный способ сделать это

if (is_numeric($imput) && isset($input[3])) 
{ 
    // your code 
} 

Исеть() является языковой конструкцией, которая всегда быстрее, чем StrLen().

isset ($ input [n-1]) сообщает вам, имеет ли строка (данные, которая проходит через форму всегда строка) имеет как минимум n длинных.

is_numeric() проверяет, что это допустимая строка num.

Я думаю, что это лучше, чем ctype_digit() & & strlen().

+0

is_numeric проверяет гораздо больше, чем цифры. – OIS

Смежные вопросы