За последние 24 часа нас посетили 16924 программиста и 1274 робота. Сейчас ищут 1439 программистов ...

Рег выражение не правильно заменяет текст.

Тема в разделе "Регулярные выражения", создана пользователем antiKILLER, 6 май 2008.

  1. antiKILLER

    antiKILLER Активный пользователь

    С нами с:
    6 май 2008
    Сообщения:
    16
    Симпатии:
    0
    Адрес:
    Заречный, Пенз.обл.
    Итак, я в своём сайте вырезаю из текстов, добавленных пользователями и мной самим опасные тэги такой вот функцией:

    Код (Text):
    1. function del_bad_tegs($WHERE_DEL)//Удаление опасных тэгов
    2. {
    3.  $i=1;
    4.  $bad_teg[1]='FRAME'; $bad_teg[2]='MARQUEE'; $bad_teg[3]='SCRIPT'; $bad_teg[4]='APPLET'; $bad_teg[5]='IFRAME'; $bad_teg[6]='FRAMESET';
    5.  while ($i++!=6)
    6.  {
    7.   $WHERE_DEL=preg_replace('/<'.$bad_teg[$i].'.*>/imx','!Опасный тэг!',$WHERE_DEL);
    8.  }
    9.  return $WHERE_DEL;
    10. }
    На вход функции всегда подаётся одна строка, но довольно длинная. (Несколько тысяч символов может быть.)
    Функция работает нормально, до первого опасного тэга.
    Т.е. если функции передать такой текст :
    Код (Text):
    1. <p>Текст скриптики типа того.</p><script type="text/javascript">бла бла бла...</script><p>И дальше тоже текстик идёёёёёттт!!!!</p>
    То результат получается таким:
    А должен быть таким:
    Т.е. должен заменяться только сам открывающийся тэг.. Что я неверно делаю?
     
  2. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  3. antiKILLER

    antiKILLER Активный пользователь

    С нами с:
    6 май 2008
    Сообщения:
    16
    Симпатии:
    0
    Адрес:
    Заречный, Пенз.обл.
    Sergey89, большое спасибо.
    Но эту функцию я знаю.. хорошая функция, вот только нет обратной(((
    Конечно в крайнем случае придётся ипользовать её, но перечислять почти все существующие HTML тэги, кроме 6-8 "нехороших" не очень хочется. (хотя учитывая сколько я мучаюсь с этим рег выражением, так сделать было бы проще, но всё-таки)
    Инетресно было бы послушать ещё возможные варианты решения проблемы..
     
  4. antiKILLER

    antiKILLER Активный пользователь

    С нами с:
    6 май 2008
    Сообщения:
    16
    Симпатии:
    0
    Адрес:
    Заречный, Пенз.обл.
    Большое спасибо Sergey89 за попытку помочь... проблему решил.
    Если кому когда пригодится, то вот такой функция, которая удаляет "плохие" тэги, как бы они не были записаны.
    Код (Text):
    1. function del_bad_tegs($WHERE_DEL)
    2. {
    3.  $bad_tags=array
    4.  (
    5.   '@(<\s*SCRIPT\s*[^>]*?>.*?<\s*/\s*SCRIPT\s*>|<\s*SCRIPT\s*[^>]>)@simx',
    6.   '@(<\s*FRAME\s*[^>]*?>.*?<\s*/\s*FRAME\s*>|<\s*FRAME\s*[^>]*?>)@simx',
    7.   '@(<\s*IFRAME\s*[^>]*?>.*?<\s*/\s*IFRAME\s*>|<\s*IFRAME\s*[^>]*?>)@simx',
    8.   '@(<\s*FRAMESET\s*[^>]*?>.*?<\s*/\s*SCRIPT\s*>|<\s*FRAMESET\s*[^>]*?>)@simx',
    9.   '@(<\s*MARQUEE\s*[^>]*?>.*?<\s*/\s*SCRIPT\s*>|<\s*MARQUEE\s*[^>]*?>)@simx',
    10.   '@(<\s*APPLET\s*[^>]*?>.*?<\s*/\s*SCRIPT\s*>|<\s*APPLET\s*[^>]*?>)@simx',
    11.  );
    12.  $WHERE_DEL = preg_replace($bad_tags, '!!!Опасный тэг!!!', $WHERE_DEL);
    13.  return $WHERE_DEL;
    14. }
    В частности после передачи скрипту даже такого извращённого варианта кода:
    Код (Text):
    1. < iframe src="http://webforever.info/" width=15 height=20>1<br>qweqwe
    2. < iframe src="http://webforever.info/" width=15 height=20>1< / iframe  ><br>ssssss
    3. <script>document.write('Alert!'); qqqqqqq
    4. <script>document.write('Alert!'); </script>wwwwww
    Будет такой результат:
    Т.к. проблема решена, тему можно закрывать.
     
  5. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    0_o извращение
     
  6. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    antiKILLER
    а если тебе надо будет в тексте привести эти слова? ;)
    не лучше ли просто htmlspecialchars + несколько замен руками? :)
     
  7. antiKILLER

    antiKILLER Активный пользователь

    С нами с:
    6 май 2008
    Сообщения:
    16
    Симпатии:
    0
    Адрес:
    Заречный, Пенз.обл.
    antonn,
    А в тексте как раз используются не < > а &lt; и &gt;. И, соответсвенно, замены не проиходит))
    htmlspecialchars в моём случае не подходит, т.к. в принципе используются html тэги и при обработке функций не будет вообще форматирования..
     
  8. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    antiKILLER
    У меня обрабатывает регулярка, которая преобразует &lt; в < у разрешенных тегов (например, span & font). И не надо перечислять сотню других.
     
  9. antiKILLER

    antiKILLER Активный пользователь

    С нами с:
    6 май 2008
    Сообщения:
    16
    Симпатии:
    0
    Адрес:
    Заречный, Пенз.обл.
    Kreker,
    Хм.. А это тоже идея.... спасибо за мысль..
     
  10. NOmeR1

    NOmeR1 Активный пользователь

    С нами с:
    11 май 2008
    Сообщения:
    97
    Симпатии:
    0
    Что-то вроде этого:
    Код (Text):
    1. function del_bad_tegs($WHERE_DEL)//Удаление опасных тэгов
    2. {
    3.  $i=1;
    4.  $bad_teg[1]='FRAME'; $bad_teg[2]='MARQUEE'; $bad_teg[3]='SCRIPT'; $bad_teg[4]='APPLET'; $bad_teg[5]='IFRAME'; $bad_teg[6]='FRAMESET';
    5.  while ($i++!=6)
    6.  {
    7.   $WHERE_DEL=preg_replace('/<\s*'.$bad_teg[$i].'[^>]*>(.*<\s*\/\s*'.$bad_teg[$i].'[^>]*>)?/imx','!Опасный тэг!',$WHERE_DEL);
    8.  }
    9.  return $WHERE_DEL;
    10. }
     
  11. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    antiKILLER, а чего будешь делать с
    Код (Text):
    1. <a href="ссылка" onclick="alert('Превед!')">голые женщины инсайд</a>
     
  12. antiKILLER

    antiKILLER Активный пользователь

    С нами с:
    6 май 2008
    Сообщения:
    16
    Симпатии:
    0
    Адрес:
    Заречный, Пенз.обл.
    lexa, вот над этим как раз и тружусь. Вот такое вот рег выражение:
    Код (Text):
    1. '@(<\s*A.*?on.*?>.*?<\s*/\s*А\s*>|<\s*A.*?on.*?>)@simx'
    не всегда правильно обрубает((