Кто может помочь с регуляркой..... Вообще допустим у меня есть входные параметры, там предложение какое-либо. Мне нужно, чтобы символы a-z A-Z 0-9 а-я А-Я было там разрешены, а также символ ' заменялся на ", вообщем, а все остальное просто удалялось бы, тоесть оставались только разрешенные символы... Кто-нить знает как это реализовать?
вот какбэ моя недоделанная статья про фильтр... тебе остается тока отфильтровать то что я не отфильтровал... PHP: Фильтровать я решил следующие опасные или нежелательные сообщения: 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 раз сложнее..... Надо это делать через регулярку именно. Чтобы все символы которые на входят удалялись... Тоесть можно, только:
Что-нить типа Code: $str =~ y/'/"/; $str =~ s/[^A-Za-zА-Яа-я0-9"]//g; В квадратных скобках укажи те символы, которые фильтроваться не должны
Вообщем впринципи у меня можно считать получилось выглядит таким образом PHP: 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: PHP: $str = str_replace("'", '"', $str); А для удаления лишних символов лучше поступить так: PHP: $text = preg_replace('/[^a-zA-Zа-яА-Я0-9\!\,\.\?\ \"\n]+/', '', $text); // все, что нам не подходит, заменяем пустым местом, то бишь удаляем Меньше операций - быстрее работа.
омг, извращенец... Намного проще так: PHP: <?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); ?> Плюс ко всему восклицательный знак и запятую экранировать не обязательно.