Итак, я в своём сайте вырезаю из текстов, добавленных пользователями и мной самим опасные тэги такой вот функцией: Код (Text): function del_bad_tegs($WHERE_DEL)//Удаление опасных тэгов { $i=1; $bad_teg[1]='FRAME'; $bad_teg[2]='MARQUEE'; $bad_teg[3]='SCRIPT'; $bad_teg[4]='APPLET'; $bad_teg[5]='IFRAME'; $bad_teg[6]='FRAMESET'; while ($i++!=6) { $WHERE_DEL=preg_replace('/<'.$bad_teg[$i].'.*>/imx','!Опасный тэг!',$WHERE_DEL); } return $WHERE_DEL; } На вход функции всегда подаётся одна строка, но довольно длинная. (Несколько тысяч символов может быть.) Функция работает нормально, до первого опасного тэга. Т.е. если функции передать такой текст : Код (Text): <p>Текст скриптики типа того.</p><script type="text/javascript">бла бла бла...</script><p>И дальше тоже текстик идёёёёёттт!!!!</p> То результат получается таким: А должен быть таким: Т.е. должен заменяться только сам открывающийся тэг.. Что я неверно делаю?
Sergey89, большое спасибо. Но эту функцию я знаю.. хорошая функция, вот только нет обратной((( Конечно в крайнем случае придётся ипользовать её, но перечислять почти все существующие HTML тэги, кроме 6-8 "нехороших" не очень хочется. (хотя учитывая сколько я мучаюсь с этим рег выражением, так сделать было бы проще, но всё-таки) Инетресно было бы послушать ещё возможные варианты решения проблемы..
Большое спасибо Sergey89 за попытку помочь... проблему решил. Если кому когда пригодится, то вот такой функция, которая удаляет "плохие" тэги, как бы они не были записаны. Код (Text): function del_bad_tegs($WHERE_DEL) { $bad_tags=array ( '@(<\s*SCRIPT\s*[^>]*?>.*?<\s*/\s*SCRIPT\s*>|<\s*SCRIPT\s*[^>]>)@simx', '@(<\s*FRAME\s*[^>]*?>.*?<\s*/\s*FRAME\s*>|<\s*FRAME\s*[^>]*?>)@simx', '@(<\s*IFRAME\s*[^>]*?>.*?<\s*/\s*IFRAME\s*>|<\s*IFRAME\s*[^>]*?>)@simx', '@(<\s*FRAMESET\s*[^>]*?>.*?<\s*/\s*SCRIPT\s*>|<\s*FRAMESET\s*[^>]*?>)@simx', '@(<\s*MARQUEE\s*[^>]*?>.*?<\s*/\s*SCRIPT\s*>|<\s*MARQUEE\s*[^>]*?>)@simx', '@(<\s*APPLET\s*[^>]*?>.*?<\s*/\s*SCRIPT\s*>|<\s*APPLET\s*[^>]*?>)@simx', ); $WHERE_DEL = preg_replace($bad_tags, '!!!Опасный тэг!!!', $WHERE_DEL); return $WHERE_DEL; } В частности после передачи скрипту даже такого извращённого варианта кода: Код (Text): < iframe src="http://webforever.info/" width=15 height=20>1<br>qweqwe < iframe src="http://webforever.info/" width=15 height=20>1< / iframe ><br>ssssss <script>document.write('Alert!'); qqqqqqq <script>document.write('Alert!'); </script>wwwwww Будет такой результат: Т.к. проблема решена, тему можно закрывать.
antiKILLER а если тебе надо будет в тексте привести эти слова? не лучше ли просто htmlspecialchars + несколько замен руками?
antonn, А в тексте как раз используются не < > а < и >. И, соответсвенно, замены не проиходит)) htmlspecialchars в моём случае не подходит, т.к. в принципе используются html тэги и при обработке функций не будет вообще форматирования..
antiKILLER У меня обрабатывает регулярка, которая преобразует < в < у разрешенных тегов (например, span & font). И не надо перечислять сотню других.
Что-то вроде этого: Код (Text): function del_bad_tegs($WHERE_DEL)//Удаление опасных тэгов { $i=1; $bad_teg[1]='FRAME'; $bad_teg[2]='MARQUEE'; $bad_teg[3]='SCRIPT'; $bad_teg[4]='APPLET'; $bad_teg[5]='IFRAME'; $bad_teg[6]='FRAMESET'; while ($i++!=6) { $WHERE_DEL=preg_replace('/<\s*'.$bad_teg[$i].'[^>]*>(.*<\s*\/\s*'.$bad_teg[$i].'[^>]*>)?/imx','!Опасный тэг!',$WHERE_DEL); } return $WHERE_DEL; }
antiKILLER, а чего будешь делать с Код (Text): <a href="ссылка" onclick="alert('Превед!')">голые женщины инсайд</a>
lexa, вот над этим как раз и тружусь. Вот такое вот рег выражение: Код (Text): '@(<\s*A.*?on.*?>.*?<\s*/\s*А\s*>|<\s*A.*?on.*?>)@simx' не всегда правильно обрубает((