Очищает HTML-документ от возможных вставок на языкеJavaScript. В процессе очистки удаляются узлы из DOM-дерева документа.
Синтаксис
УдалитьПоКатегории(<КатегорияСодержимого>)Полное описание, параметры и ограничения
ДокументHTML.УдалитьПоКатегории (HTMLDocument.DeleteByCategory)
ДокументHTML (HTMLDocument)
УдалитьПоКатегории (DeleteByCategory)
Доступен, начиная с версии 8.3.13.
Синтаксис:
УдалитьПоКатегории(<КатегорияСодержимого>)
Параметры:
<КатегорияСодержимого> (обязательный)
Тип: КатегорияСодержимогоHTML, Массив.
Параметр определяет категорию элементов или массив элементов типа КатегорияСодержимогоHTML, которые будут удалены из документа.
Если передан массив, то из дерева документа будут удалены все элементы, которые удовлетворяют хотя бы одному из переданных типов элементов.
Примеры:
Если в параметре передать "КатегорияСодержимогоHTML.JavascriptТеги", то из дерева будут удалены все элементы вида <script>…</script>.
Если передан [КатегорияСодержимогоHTML.JavascriptТеги, КатегорияСодержимогоHTML.IframeТеги] будут удалены элементы вида <script>…</script> и элементы вида <iframe>…</iframe>.
Описание:
Очищает HTML-документ от возможных вставок на языкеJavaScript. В процессе очистки удаляются узлы из DOM-дерева документа.
Доступность:
Тонкий клиент, сервер, толстый клиент.
Использование в версии:
Доступен, начиная с версии 8.3.13.
Методическая информация
Практические примеры
Удалить две категории из собственного инертного HTML
Разбираем строку со script, который хранит только текст, и iframe без src. Ничего не отображаем и не запускаем; проверяем удаление соответствующих узлов.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Используйте учебную базу платформы 8.5.1.1343 и серверную процедуру учебного общего модуля. Каждый пример выполняйте отдельно.
Все данные заказа вымышлены и находятся в строке. ЧтениеHTML разбирает данные, но не является браузером: форма не отправляется, ссылки не открываются, картинки не скачиваются.
Никакие файлы, адреса сайтов, токены и документы информационной базы не нужны. Не заменяйте учебную строку произвольным внешним HTML без отдельной проверки безопасности.
Индексы коллекций начинаются с нуля. Перед обращением к найденному узлу проверяйте Неопределено; перед специальными свойствами элемента проверяйте его тип.
HTML = "<html><head><title>Учебный заказ</title><meta id='meta' name='description' content='Вымышленный заказ'></head>
|<body id='body'><p id='note'>Заказ существует только в памяти</p><pre id='code'>A-01: 3
|B-02: 1</pre>
|<form id='order' name='order' action='' method='get'>
|<input id='customer' name='customer' type='text' value='Учебный покупатель'>
|<input id='accepted' name='accepted' type='checkbox' value='yes'>
|<button id='preview' name='preview' type='button' value='preview'>Предпросмотр</button></form>
|<table id='items' summary='Книга и ручка'><caption id='caption'>Товары</caption><colgroup><col id='column'></colgroup><tbody>
|<tr id='book'><td id='book-name'>Книга</td><td>3</td></tr><tr id='pen'><td>Ручка</td><td>1</td></tr>
|</tbody></table><a id='help' name='help' href='#note'>Пояснение</a><img id='logo' alt='Учебная картинка без источника'>
|</body></html>";
Чтение = Новый ЧтениеHTML;
Чтение.УстановитьСтроку(HTML);
Попытка
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(Чтение);
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Если ТипЗнч(Документ) <> Тип("ДокументHTML") Тогда
ВызватьИсключение "Ожидался ДокументHTML, а не XML-документ";
КонецЕсли;
Форма = Документ.ПолучитьЭлементПоИдентификатору("order");
Если Форма = Неопределено Тогда
ВызватьИсключение "Не найден учебный элемент order";
КонецЕсли;
Если ТипЗнч(Форма) <> Тип("ЭлементФормаHTML") Тогда
ВызватьИсключение "Неожиданный тип учебного элемента order";
КонецЕсли;
Блок = Документ.СоздатьЭлемент("guide-section");
Если ТипЗнч(Блок) <> Тип("ЭлементHTML") Тогда
ВызватьИсключение "Учебный контейнер должен иметь общий тип ЭлементHTML";
КонецЕсли;
Форма.ДобавитьДочерний(Блок);
Скрипт = Документ.СоздатьЭлемент("script");
Если ТипЗнч(Скрипт) <> Тип("ЭлементСкриптHTML") Тогда
ВызватьИсключение "Проверьте фактический тип собственного script";
КонецЕсли;
Скрипт.УстановитьАтрибут("type", "text/plain");
Скрипт.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел("Учебный текст, не программа"));
Фрейм = Документ.СоздатьЭлемент("iframe");
Если ТипЗнч(Фрейм) <> Тип("ЭлементПлавающийФреймHTML") Тогда
ВызватьИсключение "Проверьте фактический тип собственного iframe";
КонецЕсли;
Блок.ДобавитьДочерний(Скрипт);
Блок.ДобавитьДочерний(Фрейм);
Сообщить(Документ.ПолучитьЭлементыПоИмени("script").Количество() = 1);
Сообщить(Документ.ПолучитьЭлементыПоИмени("iframe").Количество() = 1);
Категории = Новый Массив;
Категории.Добавить(КатегорияСодержимогоHTML.JavascriptТеги);
Категории.Добавить(КатегорияСодержимогоHTML.IframeТеги);
Документ.УдалитьПоКатегории(Категории);
Сообщить(Документ.ПолучитьЭлементыПоИмени("script").Количество() = 0);
Сообщить(Документ.ПолучитьЭлементыПоИмени("iframe").Количество() = 0);
Сообщить(Документ.Формы.Количество() = 1);Разбор по шагам
Используем только свой документ в памяти; script содержит инертный текст и type=text/plain, iframe не содержит src.
Массив категорий означает удаление элементов хотя бы одной категории, а не одновременно обеих.
После операции повторно считаем теги и контролируем сохранность своей формы.
Как проверить результат
Пять сравнений Истина: по одному тегу до удаления, по нулю после и сохранена одна форма.
Код не использует браузер, ПолеHTMLДокумента, ЗапуститьПриложение или HTTPСоединение.
Ожидаемый результат
Показано ограниченное удаление двух конкретных категорий в памяти.
На что обратить внимание
Не называйте такое удаление универсальным санитайзером: остаются другие теги, атрибуты и схемы ссылок.
Не подставляйте сюда реальный внешний HTML и не показывайте его пользователю без отдельной политики обработки.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.