Удаление HTML тегов из строки в SQL Server: решение на T-SQL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы мгновенно очистить строку от HTML-тегов в SQL Server, воспользуйтесь сочетанием функций WHILE loop, PATINDEX и STUFF:

SQL
Скопировать код
DECLARE @Html NVARCHAR(MAX) = '<p>Некий <b>HTML</b> контент.</p>';

WHILE PATINDEX('%<%>%', @Html) > 0
    SET @Html = STUFF(@Html, PATINDEX('%<%>%', @Html), CHARINDEX('>', @Html, PATINDEX('%<%>%', @Html)) – PATINDEX('%<%>%', @Html) + 1, '');

SELECT @Html AS CleanText;

В итоге получите: "Некий HTML контент." — теги отсутствуют. Просто и эффективно! Однако, если нам необходимо избавиться от вложенных тегов или HTML-сущностей, подход следует усложнить.

Кинга Идем в IT: пошаговый план для смены профессии

Продвинутые стратегии: XML и пользовательские функции

Применение XML в T-SQL для сложных HTML-структур

Тип данных XML в SQL Server идеально подходит для очистки HTML-тегов и декодирования HTML-сущностей:

SQL
Скопировать код
DECLARE @Html NVARCHAR(MAX) = '<p>Некий <b>HTML</b> контент &amp; сущности.</p>';
SELECT TRY_CAST('<XML><![CDATA[' + @Html + ']]></XML>' AS XML).value('.', 'NVARCHAR(MAX)') AS CleanText;

Если вы работаете в SQL 2000, замените MAX на (4000) или укажите предельное значение.

Пользовательские функции для сложных задач

Пользовательская функция (UDF) — это гибкий инструмент для тех, кому требуется удалить определённые теги, например <STYLE>, и настроить её под свои нужды:

SQL
Скопировать код
CREATE FUNCTION dbo.udf_StripHTML (@HTMLText NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    -- Задаём границы тегов
    -- Добавляем обработку исключений для тегов STYLE вместe с содержимым
    -- Реализуем циклическое удаление тегов
    RETURN @StrippedHTMLText
END

Пользовательские функции (UDFs) универсальны: они подходят для множества сценариев использования и не вносят искажений в данные. Обязательно используйте REPLACE для корректной обработки HTML-сущностей.

Производительность — всегда в приоритете

Независимо от того, используете ли вы методы XML или Пользовательских функций, проведите тестирование на отрывке данных. Производительность – это ключевой момент, ведь замедленная обработка вряд ли окажется полезной. SQL Server требует разумного подхода для максимально эффективной работы!

Визуализация

Представьте себе процесс как фруктовый салат, оснащенный декорациями, которые символизируют HTML-теги:

Markdown
Скопировать код
Салат с декорациями: 🥗🎀🍎🎈🍇🎉🍌🖼️

Задача SQL Server — избавить салат от декораций, оставив только фруктовый вкус:

SQL
Скопировать код
SELECT dbo.StripHTMLTags('<b>🍎</b><img src="decor.png">🍇<i>🍌</i>');
-- И вы говорите: "Хочу только фрукты, без декораций!" 🍎🍇🍌

Вот что остаётся после удаления декораций:

Markdown
Скопировать код
Салат без декораций: 🍎🍇🍌

Это как-бы стиль Мари Кондо в области данных, где избавляемся от всего ненужного!

Особенности обработки специальных символов

Обработка символов с диакритическими знаками

SQL Server с лёгкостью справляется со специальными символами, вроде диакритических знаков. Для нормализации воспользуйтесь таким методом:

SQL
Скопировать код
SELECT REPLACE(@Html COLLATE Latin1_General_BIN, 'é', 'e') AS NormalizedText;

Функция collate — незаменимый инструмент при работе с текстовыми данными.

HTML-сущности при конвертации

При работе с HTML-тегами нам часто приходится иметь дело с HTML-сущностями, которые требуют преобразования. Это можно осуществить следующим образом:

SQL
Скопировать код
SET @Html = REPLACE(@Html, '&amp;', '&');
SET @Html = REPLACE(@Html, '&lt;', '<');
-- И так далее, меняйте все сущности, как настоящий супергерой!

Такие преобразования помогают сохранить оригинальный смысл текста.

Удаление HTML-тегов без создания пользовательских функций

Если вы не желаете использовать пользовательские функции, можно применить метод TRY_CAST и XML для удаления HTML-тегов. Инструкции крайне сжаты:

SQL
Скопировать код
SELECT TRY_CAST(@Html AS XML).value('(/text())[1]', 'VARCHAR(MAX)') AS PlainText;

Это преобразует текст в формат без тегов, избавляя от необходимости в дополнительных функциях. Эффективное и изящное решение, не так ли?

Полезные материалы

  1. SQL Html Agility Pack для работы с HTMLрепозиторий GitHub Html Agility Pack, .NET-библиотека для парсинга HTML.