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()


is_numeric примет "-0.5 e+12"в качестве действительного идентификатора.


не совсем то же самое.

из документов 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;
    }