Проверка подлинности PHP is_numeric или preg_match 0-9

Для меня это не большая проблема (насколько мне известно), это больше меня интересует. Но в чем основное отличие, если таковое имеется, – использовать is_numeric поверх preg_match (или наоборот) для проверки входных значений пользователя.

Пример 1:

 <?php $id = $_GET['id']; if (!preg_match('/^[0-9]*$/', $id)) { // Error } else { // Continue } ?> 

Пример 2:

 <?php $id = $_GET['id']; if (!is_numeric($id)) { // Error } else { // Continue } ?> 

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

is_numeric() проверяет, является ли значение числом. Это не обязательно должно быть целым числом, но это может быть десятичное число или число в научной нотации.

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

Обратите внимание, что регулярное выражение, которое вы указали, также не является идеальной цельной проверкой, как вы ее написали. Это не допускает негативов; он допускает строку с нулевой длиной (т. е. без каких-либо цифр вообще, которая предположительно не должна быть действительной?), и она позволяет номеру иметь любое количество начальных нулей, что опять же не может быть предназначено.

[РЕДАКТИРОВАТЬ]

Согласно вашему комментарию, лучшее регулярное выражение может выглядеть так:

 /^[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 имеет нечто вроде «+ 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.5e + 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 проверяет больше:

Определяет, является ли данная переменная числовой. Числовые строки состоят из необязательного знака, любого количества цифр, необязательной десятичной части и необязательной экспоненциальной части. Таким образом, + 0123.45e6 является допустимым числовым значением. Также допускается шестнадцатеричное обозначение (0xFF), но только без знака, десятичной и экспоненциальной частей.

is_numeric проверяет, является ли это любым числом, в то время как ваше регулярное выражение проверяет, является ли оно целым числом, возможно, с ведущими 0. Для идентификатора, хранящегося в виде целого числа, вполне вероятно, что мы не хотим иметь ведущих 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() здесь намного лучше. Это более читаемо и немного быстрее, чем регулярное выражение.

Проблема с вашим регулярным выражением здесь заключается в том, что она не даст десятичных значений, поэтому по существу вы только что is_int() в regex. Регулярные выражения должны использоваться только тогда, когда на вашем входе имеется нестандартный формат данных; PHP имеет множество встроенных функций проверки, даже средство проверки электронной почты без регулярного выражения .

Функция is_numeric от PHP позволяет использовать как float, так и целые числа. В то же время функция 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} $ /

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

 /^[1-9][0-9\.]{0,15}$/ 

чтобы позволить значения float.

Вы можете использовать этот код для проверки номера:

 if (!preg_match("/^[0-9]+$/i", $phone)) { $errorMSG = 'Invalid Number!'; $error = 1; }