Рефераты
 

Об удалении тегов

Об удалении тегов

Об удалении тегов

Олег Алистратов, 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. Все данные, введенные посетителем, оставлять без изменений и "как есть" заносить их в базу данных или в файл.
2. Так их и хранить.
3. Преобразовывать их только перед выводом на страницу. Для этого заменяем сначала амперсанд, а затем кавычки и угловые скобки на "энтити".
4. Если не выводим в поле типа textarea, дополнительно заменяем переводы строк на тег <br>.

Все. Вот функция замены на Перле:

sub html_chars

{

my ($r, $br) = @_;

$r =~ s/&/&amp;/gs;

$r =~ s/"/&quot;/gs;

$r =~ s/</&lt;/gs;

$r =~ s/>/&gt;/gs;

$r =~ s/\n/<br>/gs if $br;

return $r;

}

Она принимает два параметра: обязательный -- текст (скаляр), подлежащий преобразованию, и необязательный флажок (любого типа, ненулевой и непустой), показывающий, делать ли преобразование переводов строк.

Итак, я советую вам определиться -- собираетесь ли вы удалять теги в присланных данных. Если нет, то разберитесь раз и навсегда, как и когда подавлять их перед выводом страницы пользователю. И тогда вы просветлеете обликом и наполните свою жизнь смыслом еще на 18 процентов...

Искренне Ваш,
Олег Алистратов, Aiken WDS.


© 2010 BANKS OF РЕФЕРАТ