Проверка числовых параметров в PHP. Регулярное выражение проверки на число Проверка переменной на число php

Windows 10

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

Начать статью, пожалуй, стоит с того, что регулярные выражения — это очень мощное средство для работы с текстом. Как вы уже знаете, с помощью регулярных выражений мы можем отыскать в массиве текста буквально что угодно. Однако злоупотреблять такой мощью не стоит. Не забывайте о том, что PHP предлагает нам массу функций для работы со строками, типами и так далее, которые позволяют проверить, скажем, наличие определенного символа или подстроки в строке.

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

Но по условиям поставленной в статье задачи нам необходимо использовать регулярные выражения, поэтому решим поставленную задачу, используя функцию preg_match() . Данная функция проверяет строку на соответствие шаблону регулярного выражения. Функция имеет 5 параметров, из которых на практике практически всегда используются только первые 2.

Первый параметр функции будет шаблоном регулярного выражения. Второй — проверяемая строка. Иногда может понадобится третий параметр, указав который мы получим массив с результатами поиска.

Давайте же составим свой первый шаблон. Выглядеть он может следующим образом:

$pattern = "#^+$#";

$ pattern = "#^+$#" ;

На первый взгляд может выглядеть непонятно и несколько пугающе. Однако ничего страшного здесь нет, сейчас мы его разберем. Начнем с того, что регулярные выражения активно используют специальные символы, т.н. метасимволы. В нашем шаблоне их достаточно много:

^ — метасимвол начала строки

$ — метасимвол конца строки

— метасимволы символьного класса

+ — квантификатор, обозначающий 1 или более вхождений символа или группы символов, после которых использован квантификатор.

Итого, что же мы получили? Как можно прочесть составленный шаблон регулярного выражения? А читается он так:

строка будет валидироваться целиком, от начала до конца (метасимволы ^$)

в строке могут быть только цифры от 0 до 9 ()

в строке должна быть как минимум одна цифра (+)

Теперь давайте проверим шаблон в действии.

Как видим, регулярное выражение работает корректно. Под него подошли только строки, полностью состоящие из цифр. Кстати, если вы тестируете также на сайте regexr.com и в тексте более одной строки, тогда для шаблона необходимо указать специальный флаг — m, что позволит шаблону работать с многострочным текстом. Сделать это можно в правом верхнем углу, пункт меню flags.

Обратите внимание, что произойдет, если мы уберем метасимволы начала и/или конца строки:

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

$arr = ["123", "test", "45ew45", "456"]; $pattern = "#^+$#"; foreach($arr as $item){ if(preg_match($pattern, $item)){ echo "

Строка $item содержит только цифры

"; }else{ echo "

Строка $item не подходит

"; } }

$ arr = [ "123" , "test" , "45ew45" , "456" ] ;

$ pattern = "#^+$#" ;

foreach ($ arr as $ item ) {

Например возьмём такой адрес: http://example.com/price.php?product=859844&page=99 .

Скрипт выводит список цен в магазинах для товара product, необязательный параметр page указывает номер страницы. Если page не указан, и url выглядит как http://example.com/price.php?product=859844 , тогда выводим первую страницу.

До версии PHP 5.2.0 задачу можно было решить таким нехитрым образом.

// Функция получения параметра, являющегося натуральным числом // $arr = массив параметров ($GET или $POST), $name = имя параметра, // Функция возвращает значение параметра, либо $default если параметр отсутствует, либо некорректен function get_param_nat($arr, $name, $default=null) { if (!isset($arr[$name])) return $default; // Проверяем очень нехитрым способом, конвертируем параметр в число, потом обратно в строку // Если все нормально, то полученная строка должна совпадать с исходным значеним параметра $val = $arr[$name]; $intval = intval($val); // В нагрузку проверяем, что число у нас получилось больше нуля if (strval($intval) !== $val || $intval < 1) return $default; return $intval; } // Проверяем параметр product if (($product = get_param_nat($_GET, "product")) === null) die("Product not found"); // Получаем номер страницы $page = get_param_nat($_GET, "page", 1);

Начиная в версии 5.2.0 в PHP появилась группа функций Filter: filter_var, filter_input, filter_var_array и несколько других. Функции могут проверять переменные на целые числа, числа с плавающей точкой, e‑mail, ip‑адреса, url и т.д., а также очищать строки в соответствии заданным параметрам.

Перепишем код с использование функции filter_input.

Function get_param_nat($type, $name, $default=null) { $val = filter_input($type, FILTER_VALIDATE_INT, array("min_range" => 1, "max_range" => PHP_INT_MAX)); // filter_input возвращает false, если фильтрация закончилась неудачей, или null, если переменная неопределена if ($val === null || $val === false) return $default; return $val; } // Проверяем параметр product if (($product = get_param_nat(INPUT_GET, "product")) === null) die("Product not found"); // Получаем номер страницы $page = get_param_nat(INPUT_GET, "page", 1);

Небольшое тестирование показало, что по скорости работы два варианта функции get_param_nat практически одинаковы, а в случае отсутствия параметра, например не будет указано page, первый вариант будет отрабатывать даже несколько быстрее.

Поэтому вам решать, что использовать. Я лично использую первую функцию, мне она как‑то ближе и понятнее.

Ну и небольшое лирическое отступление в конце. Во избежании дублирования страницы для поисковиков, например без page и с page=1, рекомендую в разделе head страницы указывать канонический url. Выглядеть это будет примерно так:

...