|
||||||||||||
|
||||||||||||
|
|||||||||
МЕНЮ
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА - РЕФЕРАТЫ - Об удалении теговОб удалении теговОб удалении теговОлег Алистратов, www.ali.com.ua Удивительно много мифов владеет умами человечества. Древние сушили балду над задачами об удвоении куба и трисекции угла. Позднее вошли в моду поиски философского камня и отбирание у сарацинов гроба Господня. В новое время занимались исследованием флогистона, эфира и обезьяньих желез. Довольно долго пытались решить проблему установления счастья для всех -- в одном отдельно взятом государстве. С появлением веб-технологий у людей нашлась новая погремушка -- удаление тегов. Как известно, документ на HTML состоит из двух вещей: текста как такового и тегов, задающих его структуру. Мухи отдельно, котлеты отдельно. Теги используются также для оформления текста, и этим часто злоупотребляют новички, заставляя негодовать суровых именитых дизайнеров. Но какие теги использовать, сколько и каким образом -- личное дело каждого. И пока это остается вашим личным делом, все в порядке. Но вот веб-мастер пожелал иметь на своем сайте чат или форум. Или, кто попроще, гостевую книгу. Или, кто посерьезней, страницу обратной связи. Суть в том, что он теперь не распоряжается единолично наполнением контента своего сайта -- контент, в большей или меньшей степени, формируют посетители. Посетитель же имеет вредную склонность писать в поля форм всякую ерунду. Просто так ерунду писать он не будет -- только время зря тратить. Если же посетитель технически грамотен и тяготеет к хулиганству -- ловко орудуя этими самыми тегами и java-скриптами, он будет набивать вашу гостевую книгу (или что вы там поставили) похабными надписями и картинками. Зловредные теги из сообщений посетителей следует удалять, оставляя только кристально чистый текст. Поэтому ньюс-группы и эхоконференции полны письмами под топиками "Как убрать теги??!!". Содержание их всегда одинаково, отличаются они только количеством вопросительных знаков в заголовке. Письма эти порождают массу ответов с очевидным решением -- убрать все от левой угловой скобки до следующей за ней правой, благо в HTML запрещены конструкции вида <tagA ... <tagB> ...> (впрочем, вру, возможно <!-- <img...> --> такое), и тогда регэксп (регулярное выражение, regular expression) s/<([^>]|\n)*>//g сработает нужным образом. Однако знатоки HTML сразу бьют мощным аргументом: <input type="submit" value="Next >>>"> Ясно, что этот совершенно правильный с точки зрения HTML тег описанная процедура удалит только частично, оставив невразумительный мусор. Корифеи приводят следующего монстра регулярных выражений: s/<[A-za-z]([^'">]*['"][^'"]*?['"])*[^>]*>//sig Правда, и в этом случае остаются проблемы. Но регэкспы вообще, а особенно те, что сложнее замены одной буквы на другую, смущают начинающих программистов. Не зная сути, легко допустить ошибку. Но дело не в этом... Отвлечемся от регулярных выражений, и посмотрим на проблему внимательно. "Мы должны понимать всю глубину наших глубин © Дикий прапор, ДМБ". Надо ли вообще удалять теги? А если эту статью, которую вы читаете, кто-то хочет опубликовать на форуме? Я так тщательно отбирал эти примеры, так долго подбирал этот сине-зелененький цвет... Обидно будет отправить их к индейскому Маниту, в /dev/null, или куда там отправляются вырезанные регэкспами части текста. Двух секунд раздумья веб-мастеру достаточно, чтобы убедиться: в большинстве случаев теги нужно не удалять, а показывать. Достичь этого просто: следует заменить в исходном тексте символы, используемые в тегах, на соответствующие подстановки-"энтити" (entities). Удалять же теги нужно в случае преобразования HTML в обычный текст, и для этого лучше воспользоваться подходящими библиотеками (например, модулем HTML::Parser для Перла). Однако и с "энтитями" не все так просто. Основной вопрос -- когда осуществлять подстановку. Перед сохранением данных на сервере или перед формированием страницы, и важно не сделать это дважды. До тех пор, пока я серьезно задумался над этим вопросом (ведь все казалось так элементарно! ...оно и есть элементарно, но нужна аккуратность), полная несогласованность в обработке тегов скриптами приводила к тому, что теги появлялись где не нужно, исчезали там, где нужны, а кавычки и амперсанды превращались во что-то непонятное. Если данные отдавались для повторного редактирования в форму, переводы строк должны оставаться на своих местах; а на форуме их лучше заменить на тег 1. Все данные, введенные посетителем, оставлять без изменений и "как есть" заносить их в базу данных или в файл. Все. Вот функция замены на Перле: 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 процентов... Искренне Ваш, |
РЕКЛАМА
|
|||||||||||||||||
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА | ||
© 2010 |