Реферат на тему Об удалении тегов
Работа добавлена на сайт bukvasha.net: 2013-11-18Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
от 25%
договор
Об удалении тегов
Олег Алистратов, www.ali.com.uaУдивительно много мифов владеет умами человечества. Древние сушили балду над задачами об удвоении куба и трисекции угла. Позднее вошли в моду поиски философского камня и отбирание у сарацинов гроба Господня. В новое время занимались исследованием флогистона, эфира и обезьяньих желез. Довольно долго пытались решить проблему установления счастья для всех — в одном отдельно взятом государстве. С появлением веб-технологий у людей нашлась новая погремушка — удаление тегов.
Как известно, документ на HTML состоит из двух вещей: текста как такового и тегов, задающих его структуру. Мухи отдельно, котлеты отдельно. Теги используются также для оформления текста, и этим часто злоупотребляют новички, заставляя негодовать суровых именитых дизайнеров. Но какие теги использовать, сколько и каким образом — личное дело каждого. И пока это остается вашим личным делом, все в порядке.
Но вот веб-мастер пожелал иметь на своем сайте чат или форум. Или, кто попроще, гостевую книгу. Или, кто посерьезней, страницу обратной связи. Суть в том, что он теперь не распоряжается единолично наполнением контента своего сайта — контент, в большей или меньшей степени, формируют посетители.
Посетитель же имеет вредную склонность писать в поля форм всякую ерунду. Просто так ерунду писать он не будет — только время зря тратить. Если же посетитель технически грамотен и тяготеет к хулиганству — ловко орудуя этими самыми тегами и java-скриптами, он будет набивать вашу гостевую книгу (или что вы там поставили) похабными надписями и картинками. Зловредные теги из сообщений посетителей следует удалять, оставляя только кристально чистый текст.
Поэтому ньюс-группы и эхоконференции полны письмами под топиками "Как убрать теги??!!". Содержание их всегда одинаково, отличаются они только количеством вопросительных знаков в заголовке. Письма эти порождают массу ответов с очевидным решением — убрать все от левой угловой скобки до следующей за ней правой, благо в HTML запрещены конструкции вида
<tagA ... <tagB> ...>
(впрочем, вру, возможно <!-- <img...> -->
такое), и тогда регэксп (регулярное выражение, regular exdivssion) s/<([^>]|\n)*>//g
сработает нужным образом. Однако знатоки HTML сразу бьют мощным аргументом: <input type="submit" value="Next >>>">
Ясно, что этот совершенно правильный с точки зрения HTML тег описанная процедура удалит только частично, оставив невразумительный мусор. Корифеи приводят следующего монстра регулярных выражений: s/<[A-za-z]([^'">]*['"][^'"]*?['"])*[^>]*>//sig
Правда, и в этом случае остаются проблемы. Но регэкспы вообще, а особенно те, что сложнее замены одной буквы на другую, смущают начинающих программистов. Не зная сути, легко допустить ошибку. Но дело не в этом... Отвлечемся от регулярных выражений, и посмотрим на проблему внимательно. "Мы должны понимать всю глубину наших глубин © Дикий прапор, ДМБ". Надо ли вообще удалять теги? А если эту статью, которую вы читаете, кто-то хочет опубликовать на форуме? Я так тщательно отбирал эти примеры, так долго подбирал этот сине-зелененький цвет... Обидно будет отправить их к индейскому Маниту, в /dev/null, или куда там отправляются вырезанные регэкспами части текста.
Двух секунд раздумья веб-мастеру достаточно, чтобы убедиться: в большинстве случаев теги нужно не удалять, а показывать. Достичь этого просто: следует заменить в исходном тексте символы, используемые в тегах, на соответствующие подстановки-"энтити" (entities). Удалять же теги нужно в случае преобразования HTML в обычный текст, и для этого лучше воспользоваться подходящими библиотеками (например, модулем HTML::Parser для Перла).
Однако и с "энтитями" не все так просто. Основной вопрос — когда осуществлять подстановку. Перед сохранением данных на сервере или перед формированием страницы, и важно не сделать это дважды. До тех пор, пока я серьезно задумался над этим вопросом (ведь все казалось так элементарно! ...оно и есть элементарно, но нужна аккуратность), полная несогласованность в обработке тегов скриптами приводила к тому, что теги появлялись где не нужно, исчезали там, где нужны, а кавычки и амперсанды превращались во что-то непонятное. Если данные отдавались для повторного редактирования в форму, переводы строк должны оставаться на своих местах; а на форуме их лучше заменить на тег
. В общем, стоило только чуть-чуть подумать. Через пять минут появилась методика, которая больше меня никогда не подводила. Вот она:
1. Все данные, введенные посетителем, оставлять без изменений и "как есть" заносить их в базу данных или в файл.
2. Так их и хранить.
3. Преобразовывать их только перед выводом на страницу. Для этого заменяем сначала амперсанд, а затем кавычки и угловые скобки на "энтити".
4. Если не выводим в поле типа textarea, дополнительно заменяем переводы строк на тег <br>.
Все. Вот функция замены на Перле:
sub html_chars
{
my ($r, $br) = @_;
$r =~ s/&/&/gs;
$r =~ s/"/"/gs;
$r =~ s/</</gs;
$r =~ s/>/>/gs;
$r =~ s/\n/<br>/gs if $br;
return $r;
}
Она принимает два параметра: обязательный — текст (скаляр), подлежащий преобразованию, и необязательный флажок (любого типа, ненулевой и непустой), показывающий, делать ли преобразование переводов строк. Итак, я советую вам определиться — собираетесь ли вы удалять теги в присланных данных. Если нет, то разберитесь раз и навсегда, как и когда подавлять их перед выводом страницы пользователю. И тогда вы просветлеете обликом и наполните свою жизнь смыслом еще на 18 процентов...
Искренне Ваш,
Олег Алистратов, Aiken WDS.