на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Об удалении тегов

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

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

Олег Алистратов, 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.



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.