filter_var против preg_match - PullRequest
       7

filter_var против preg_match

3 голосов
/ 09 октября 2009

Утро всем

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

В чем мой вопрос, имеет ли смысл использовать filter_var вместо preg_match? Например, есть ли повышение производительности или какие-либо другие преимущества выбора одного из других, и если да, то каковы они?

Ответы [ 3 ]

3 голосов
/ 23 марта 2015

Сначала всего, страница PHP Manual по фильтрации: https://php.net/manual/en/book.filter.php

Второй , контекст является ключевым. Вообще говоря, функции фильтра предназначены для использования внешнего входа (скаляры или массивы) или внутреннего входа . Внешний ввод поступает из таких источников, как HTTP-запрос / механизм PHP или отправка формы.

Функции фильтра с префиксом filter_input позволяют полностью исключить обход $ _SERVER, $ _COOKIE, $ _POST и $ _GET. Хотя вы обычно указываете «откуда» вы хотите получить данные, функции фильтрации явно не используют $ _POST, $ _GET, $ _COOKIE и $ _SERVER. Изменения, которые вы вносите в переменные / элементы массива , не будут отображаться в $ _GET, $ _POST или $ _SERVER, поэтому использование фильтра таким образом является изменением парадигмы и может существенно изменить поток вашего приложения. Другими словами, вы должны отслеживать внешний вход самостоятельно. Я делаю это для начальной очистки (удаления, замены, изменения и т. Д.) Внешнего ввода. Я больше не использую $ _POST, $ _GET или $ _SERVER вообще. Хотя я все еще использую $ _FILES.

Функции с префиксом filter_var предназначены для фильтрации любого общего массива, который уже существует в вашей программе. Я использую это после того, как использовал filter_input. Есть много фильтров, которые вы можете использовать в обоих случаях, но ваш вопрос о производительности .

Если вы решили использовать фильтр FILTER_VALIDATE_REGEXP с любой из функций фильтрации, я не могу представить, чтобы этот косвенный подход был более эффективным, чем прямое использование preg_match(). Что касается других фильтров, то если они просто 'n' число методов / функций, удаленных из вызова регулярного выражения, Я также не вижу улучшения эффективности там .

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

Конечно, можно жить без использования функций фильтра.

Более того, я использую функции фильтра в сочетании со своими собственными классами дезинфицирующего средства и средства проверки. Итак, я не прошу PHP думать за меня, я просто использую его для расширения того, что я уже знаю, как делать (на случай, если их функции получат что-то, что я пропустил). Глубокая защита.

В целом, вам лучше всего использовать preg_match(), если только вы не намереваетесь изменить поток (filter_input функций) ввода в ваше приложение. Даже в этом случае повышение производительности не будет, но вы можете обойти $ _SERVER, $ _POST и $ _GET. Кроме того, вы можете воспользоваться более простыми, структурированными, согласованными, фильтрующими функциями с возможностью использовать функцию обратного вызова (FILTER_CALLBACK) для вызова собственных методов / функций (что я также делаю). Кроме того, вы все еще можете использовать свои собственные регулярные выражения с функциями фильтра, используя фильтр FILTER_VALIDATE_REGEXP, но опять же, я не вижу причин полагать, что производительность вашего приложения улучшится, если вы это сделаете. Ремонтопригодность? Может быть. Это зависит от человека, пишущего код.

2 голосов
/ 09 октября 2009

filter_var - фильтрует переменную с указанным фильтром
preg_match - Выполнить сопоставление с регулярным выражением

Полагаю, использование могло бы использовать filter_var для фильтрации переменных, но в качестве замены preg_match я не думаю, что это хорошая идея для обновления с ereg, так как filter_var не использует regex, и вам придется переписать большую часть функциональности логика для этого.

1 голос
/ 19 мая 2011

Переключение на использование filter_var() было бы действительно хорошей идеей. Вы не сможете использовать свои существующие регулярные выражения, однако вы БУДЕТЕ полностью их устранить. Часто регулярные выражения, которые мы используем в наших приложениях, просто используются для простой проверки s и фильтрации, что и предназначено для функции filter_var().

Например, в вашем коде у вас уже может быть:

if (eregi('\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b', $_POST['email'])) {
    echo "valid";
}

Это можно заменить более красивой версией (не полагаясь на пользовательские регулярные выражения):

if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    echo "valid";
}

Функция filter_var() также имеет возможность дезинфицировать символов, которые не нужны для конкретных исследуемых вами данных, и возвращает очищенную строку (вместо логического значения):

$clean = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);

Этот тип использования с filter_var() заменит функции типа ereg_replace().

Однако для простейших обновлений вы можете просто «префиксировать» семейство функций ereg * () с помощью «p», что делает их совместимыми с PCRE (и, следовательно, больше не рекомендуется в PHP 5.3 +).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...