Просмотр полной версии : Регулярка - фильтр
Кто может помочь с регуляркой.....
Вообще допустим у меня есть входные параметры, там предложение какое-либо.
Мне нужно, чтобы символы a-z A-Z 0-9 а-я А-Я было там разрешены, а также символ ' заменялся на ", вообщем, а все остальное просто удалялось бы, тоесть оставались только разрешенные символы...
Кто-нить знает как это реализовать?
вот какбэ моя недоделанная статья про фильтр... тебе остается тока отфильтровать то что я не отфильтровал...
Фильтровать я решил следующие опасные или нежелательные сообщения:
1.Тэги html
2.всякие ' & (спецсимволы в ASCII кодировке)
3."<?" - открывающая конструкция в PHP, которая при вставке в сообщение заглючивает весь комментарий И теоретически дает возможность создать какой-либо скрипт на сервере, например шелл (shell, интерпретатор команд, который дает возможность управлять сервером)
4.JavaScript, который дает возможность осуществить XSS-атаку на бедных пользователей сайта
5.Открывающие конструкции скриптов HTML <
6.Пустые сообщения
Итак, цель поставили... Теперь будем ее решать =)
1.После поиска инфы в справочнике по PHP удалось найти функцию strip_tags. Она как раз получает значение строковой переменной (string), ищет в нем все известные html тэги и возвращает скрипту ту же переменную, но без тэгов...
Пример:
<?php
$message = $_POST['text'];
// получаем переменную из формы
strip_tags($message,"тут разрешенные тэги без запятых и пробелов, если надо");
?>
2. Пункт 1 решает проблему и с этими символами
3. Создаем переменную kaka, равную <? и условие, что если текст равен только этим 2 символам, то вывести надпись "Нехрен портить скрипт!"
<?php
$message = $_POST['text'];
$kaka = "<?";
if ($message == $kaka)
{
echo '<br><br><br><center>Не
хренп
ортить
скрипт!
<br><br>
<a href=javascript:history.back()>BACK</a></center>';
exit;
}
// end of filter
?>
4.JavaScript не будет работать, так как PHP автоматически, вставляя его в страницу, режет его слэшами \\, после чего он не работает
Для сайта JS не опасен в принципе, так как работает на пользовательском компе, и для пользователей теперь тоже...
5.За поиск символов в строке отвечает функция strstr. Если она найдет хоть один указанный символ, то возвратит значение true, которое мы и проверим условием и при успешном его выполнении напишем "Нельзя вставлять открывающую конструкцию!"
<?php
$message = $_POST['text'];
//filter by P3L3NG from [Depth Team]
// search
$texta = strstr($message, "<"); //ищем символ <
// end of search
if ($texta == true) {
echo '<br><br><br><center>Нел
ьзявст
авлять
открыв
ающуюк
онстру
кцию<br><br>
<a href=javascript:history.back()>BACK</a></center>';
exit;
}
?>
6.Создаем переменную blank, равную ничему и условие, что если текст равен переменной, то вывести надпись "Все символы отфильтрованы!Сообщение удалено"
<?php
$message = $_POST['text'];
//FUCKING filter by P3L3NG from [Depth Team]
$blank = "";
if ($message == $blank)
{
echo '<br><br><br><center>Все
символы
былиотф
ильтров
аны!Сооб
щениеуд
алено!<br><br>
<a href=javascript:history.back()>BACK</a></center>';
exit;
}
?>
зы... это фильтр для комментариев на сайте. чтобы опасный код не внедряли в сайт сцуки)
Нет... Ты не понял тут уже в 100 раз сложнее.....
Надо это делать через регулярку именно.
Чтобы все символы которые на входят удалялись... Тоесть можно, только: a-z A-Z 0-9 а-я А-Я , . ? !
Что-нить типа
$str =~ y/'/"/;
$str =~ s/[^A-Za-zА-Яа-я0-9"]//g;
В квадратных скобках укажи те символы, которые фильтроваться не должны
Хм.... А что делает =~ ?
И кстати как исп. то что ты дал?
Вообщем впринципи у меня можно считать получилось выглядит таким образом
public function filter_str($text) {
$search = array("/'/", // Замена ' на "
);
$replace = array('"',
);
$text = preg_replace($search, $replace, $text);
$search = "/[a-zA-Zа-яА-Я0-9\!\,\.\?\ \"\\n]+/";
preg_match_all($search, $text, $text);
$text = implode('', $text[0]);
return $text;
}
RaiDeRz, ну раз ты не указал в первом посте ЯП, я написал регулярку в терминах перла
Вообщем впринципи у меня можно считать получилось выглядит таким образом
public function filter_str($text) {
$search = array("/'/", // Замена ' на "
);
$replace = array('"',
);
$text = preg_replace($search, $replace, $text);
$search = "/[a-zA-Zа-яА-Я0-9\!\,\.\?\ \"\\n]+/";
preg_match_all($search, $text, $text);
$text = implode('', $text[0]);
return $text;
}
Использовать preg_replace для замены кавычек - то еще извращение. Для этого лучше всего подойдет str_replace:
$str = str_replace("'", '"', $str);
А для удаления лишних символов лучше поступить так:
$text = preg_replace('/[^a-zA-Zа-яА-Я0-9\!\,\.\?\ \"\n]+/', '', $text);
// все, что нам не подходит, заменяем пустым местом, то бишь удаляем
Меньше операций - быстрее работа.
.:EnoT:.
21.07.2008, 15:16
Вообщем впринципи у меня можно считать получилось выглядит таким образом
омг, извращенец...
Намного проще так:
<?php
function str($str){
preg_match_all ('/[a-zA-Zа-яА-Я0-9 \.,\?!"]+/', str_replace ("'", '"', $str), $b);
return implode('', $b[0]);
}
$a = "kldjfw+!897895k ' cvwsk()*&%dfJHYGорШОГлол абвгд'";
echo str($a);
?>
Плюс ко всему восклицательный знак и запятую экранировать не обязательно.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot