PHP является числовым или preg match 0-9 validation
это не большая проблема для меня (насколько я знаю), это то, что меня интересовало. Но в чем основное отличие, если таковое имеется, от использования is_numeric
над preg_match
(или наоборот) для проверки значений, вводимых пользователем.
Один Пример:
<?php
$id = $_GET['id'];
if (!preg_match('/^[0-9]*$/', $id)) {
// Error
} else {
// Continue
}
?>
Пример Два:
<?php
$id = $_GET['id'];
if (!is_numeric($id)) {
// Error
} else {
// Continue
}
?>
Я предполагаю, что оба делают то же самое, но есть ли какие-то конкретные различия, которые могут вызвать проблемы позже каким-то образом? Есть ли "лучший способ" или что-то, чего я не вижу делает их другими.
11 ответов
is_numeric()
проверяет, является ли значение числом. Это не обязательно должно быть целое число-это может быть десятичное число или число в научной нотации.
на preg_match()
пример вы дали только проверяет, что значение содержит цифры от нуля до девяти; любое их количество, и в любой последовательности.
обратите внимание, что регулярное выражение, которое вы дали, также не является идеальной целочисленной проверкой, как вы ее написали. Он не допускает негативов; он допускает строка нулевой длины (т. е. без цифр вообще, что предположительно не должно быть допустимым?), и это позволяет номеру иметь любое количество ведущих нулей, которые снова не могут быть предназначены.
[EDIT]
согласно вашему комментарию, лучшее регулярное выражение может выглядеть так:
/^[1-9][0-9]*$/
это заставляет первую цифру быть только между 1 и 9, поэтому вы не можете иметь ведущие нули. Это также заставляет его быть по крайней мере одной цифрой длиной, поэтому решает строку нулевой длины вопрос.
вы не беспокоитесь о негативах, так что это не проблема.
вы можете ограничить количество цифр, потому что, как вещи стоят, это позволит строки, которые слишком велики для хранения в виде целых чисел. Чтобы ограничить это, вы бы изменили звезду на ограничение длины, например:
/^[1-9][0-9]{0,15}$/
Это позволит строку от 1 до 16 цифр (т. е. первая цифра плюс дополнительно 0-15 цифр). Не стесняйтесь корректировать цифры в фигурные скобки в соответствии с вашими потребностями. Если вам нужна строка фиксированной длины, вам нужно указать только одно число в фигурных скобках.
надеюсь, что это поможет.
согласно http://www.php.net/manual/en/function.is-numeric.php, is_numeric alows что-то вроде "+0123.45e6 " или "0xFF". Я думаю, это не то, что вы ожидали.
preg_match может быть медленным, и у вас может быть что-то вроде 0000 или 0051.
Я предпочитаю использовать ctype_digit (работает только со строками, это нормально с $_GET).
<?php
$id = $_GET['id'];
if (ctype_digit($id)) {
echo 'ok';
} else {
echo 'nok';
}
?>
is_numeric () допускает любую форму числа. так что 1
, 3.14159265
, 2.71828e10
все "числовые", в то время как ваше регулярное выражение сводится к эквиваленту is_int()
не совсем то же самое.
из документов PHP is_numeric:
'42' is numeric
'1337' is numeric
'1e4' is numeric
'not numeric' is NOT numeric
'Array' is NOT numeric
'9.1' is numeric
С вашим регулярным выражением вы проверяете только "основные" числовые значения.
и is_numeric()
должно быть быстрее.
is_numeric проверяет, является ли это каким-либо числом, в то время как ваше регулярное выражение проверяет, является ли оно целым числом, возможно, с ведущими 0s. Для идентификатора, хранящегося как целое число, вполне вероятно, что мы не захотим иметь ведущие 0. Следуя ответу Спадли, мы можем сделать:
/^[1-9][0-9]*$/
однако, как отмечает Спадли, результирующая строка может быть слишком большой, чтобы храниться как 32-разрядное или 64-разрядное целое значение. Максимальное значение 32-разрядного целого со знаком составляет 2,147,483,647 (10 цифр), а максимальное значение 64-разрядного целого со знаком 9,223,372,036,854,775,807 (19 цифр). Однако многие 10-разрядные и 19-разрядные целые числа превышают максимальные 32-разрядные и 64-разрядные целые числа соответственно. Простым решением только для регулярных выражений будет:
/^[1-9][0-9]{0-8}$/
или
/^[1-9][0-9]{0-17}$/
соответственно, но эти "решения", к сожалению, ограничивают каждое целыми числами 9 и 19; вряд ли удовлетворительный результат. Лучшим решением может быть что-то вроде:
$expr = '/^[1-9][0-9]*$/';
if (preg_match($expr, $id) && filter_var($id, FILTER_VALIDATE_INT)) {
echo 'ok';
} else {
echo 'nok';
}
is_numeric
больше проверок:
определяет, является ли данная переменная числовой. Числовые строки состоят опционного знака, любого числа чисел, опционной десятичной части и необязательная экспоненциальная часть. Таким образом +0123.45e6-допустимое числовое значение. Шестнадцатеричная нотация (0xFF) тоже разрешена, но только без знака, десятичная и экспоненциальная часть.
Если вы только проверить, если это число is_numeric()
намного много лучше здесь. Это более читабельно и немного быстрее, чем regex.
проблема с вашим регулярным выражением здесь в том, что оно не позволяет десятичные значения, поэтому по существу вы только что написали is_int()
в регулярное выражение. Регулярные выражения должны использоваться только тогда, когда на Вашем входе есть нестандартный формат данных; PHP имеет множество встроенных функций проверки, даже email валидатор без regex.
PHP is_numeric функция учитывает поплавки так же, как целые числа. В то же время функция is_int слишком строга, если вы хотите проверить данные формы (только строки). Поэтому для этого обычно лучше всего использовать регулярные выражения.
строго говоря, целые числа-это целые числа положительные и отрицательные, а также включая ноль. Вот регулярное выражение для этого:
/^0$|^[-]?[1-9][0-9]*$/
или, если вы хотите разрешить ведущие нули:
/ ^[ -]?[0]|[1-9][0-9]$/
обратите внимание, что это позволит использовать такие значения, как -0000, что не вызывает проблем в PHP. (MySQL также будет бросать такие значения, как 0.)
вы также можете ограничить длину своего целого числа для соображений 32/64-битные функции платформы PHP и / или совместимость с базой данных. Например, ограничить длину целого числа до 9 цифры (за исключением необязательного знака), вы можете использовать:
/^0$|^[-]?[1-9][0-9]{0,8}$/
между тем, все значения выше будут ограничивать значения только integer, поэтому я использую
/^[1-9][0-9\.]{0,15}$/
разрешить значения float тоже.
вы можете использовать этот код для проверки номер:
if (!preg_match("/^[0-9]+$/i", $phone)) {
$errorMSG = 'Invalid Number!';
$error = 1;
}