Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 удалить теги из строки, теги в списке  [new]
tags
Guest
в таблицу в поле ntext выгружаются тексты сообщений, где присутствуют теги HTML,
необходимо получить строки без тегов, указанных пользователем.
не хотят удалять все имеющееся между < и >, т.к. возможны варианты a < b ...c > d
и такое надо оставить.
с другой стороны, 100% присутствуют теги <a href=... и тут как раз надо выкидывать все,
заключенное в <>.
список убираемых тегов пока такой: <b>, </b>, </a>, <br>, <br/>
но сказали, что возможно пополнение списков.
пока написала такое:
create function dbo.tags_remove_new
(@s ntext)
returns nvarchar(max)
as
begin
declare @tags_table table(id int, tag nvarchar(10) );
   insert into @tags_table values(1, '<b>');
   insert into @tags_table values(2, '</b>');
   insert into @tags_table values(3, '</a>');
   insert into @tags_table values(4, '<br>');
   insert into @tags_table values(5, '<br/>');

declare @a nvarchar(max), 
        @n int;

	set @n = (select count(*) from @tags_table);
    set @a = cast (@s as nvarchar(max))

	while @n>0
	begin
	   set @a = replace(@a collate Latin1_General_CI_AS,(select tag from @tags_table where id=@n), '')
	   set @n = @n - 1 
	end

    set @n = (len(@a) - len(replace(@a collate Latin1_General_CI_AS, '<a href', '' ))) / 7
	while @n>0
	begin
	   set @a = case charindex('>',@a,1) when 0 then @a
                else
                stuff(@a,
                      charindex('<a href',@a collate Latin1_General_CI_AS,1),
                      charindex('>',@a,1) - charindex('<a href',@a collate Latin1_General_CI_AS,1) + 1,
                      '')
                end 
	   set @n = @n - 1 
	end
 return @a 
end  
можно ли сделать проще и плохо ли, что при каждом вызове создается и заполняется табличная переменная? по идее, права на создание постоянной таблицы есть,
хотя товарищи и не желают засорять базу.
но если с табличной переменной плохой вариант, можно и подбить на таблицу.
пока что функция используется в хорошо фильтрованных запросах, где выдаются максимум 200 строк,
т.е. быстрота устраивает.
5 ноя 11, 12:59    [11552878]     Ответить | Цитировать Сообщить модератору
 Re: удалить теги из строки, теги в списке  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Задача не для Реляционных Баз Данных. И судя по всему, это у вас не одноразовая замена.

Уже есть готовые библиотеки, для соответствующих языков, заточенные под эти задачи.
6 ноя 11, 04:33    [11554205]     Ответить | Цитировать Сообщить модератору
 Re: удалить теги из строки, теги в списке  [new]
tags
Guest
Mnior,
я спросила про это решение, т.к. пока используется оно.
система вообще в процессе переписывания,
но сейчас должно работать хоть как-то,
а тормозов и без этого моего там хватает,
и если мое можно улучшить, то прошу поделиться соображениями
6 ноя 11, 11:25    [11554333]     Ответить | Цитировать Сообщить модератору
 Re: удалить теги из строки, теги в списке  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
tags, правильно ли я вас понял, что 100500 строк кода на SQL сейчас для вас приемлемее, чем одна строка на языке написанного вашего клинского приложения? У вас там что, всем разрабам руки трамваем отрезало? Да на худой конец CLR прикрутить.

В добавок есть нестыковочка в намерениях:
tags (1)
можно ли сделать проще ...
tags (2)
но сейчас должно работать хоть как-то
Уже работает как-то - замечательно. Теперь задача вставить одну строку в нужном месте вашего приложения (веб сервере).

tags
и если мое можно улучшить, то прошу поделиться соображениями
Непосильно. Для увлечённых паропанком процудурностью это маловероятно. Киберпанк Декларативизм уже поглотил соффремённые тёхнологии, не будьте динозаврами. Вся эта нарезка строк циклами (хотя бы в RDBS) вызывает только недоумение.

В добавок хочу сказать, что теги довольно однозначно идентифицируются из-за жёстких ограничений по спецификации. Так что вероятность наличия тегоподобных текстов минимально, что сильно ускоряет алгоритм отбора. Что уже сделано в соответствующих библиотеках парсинга.
Вместо того чтобы здесь писать ласапеды, разглагольствовать и делать вид что работаете, хотя бы тупо погуглили. Выдаются сразу готовые решения.
6 ноя 11, 21:07    [11555540]     Ответить | Цитировать Сообщить модератору
 Re: удалить теги из строки, теги в списке  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
tags,

с помощью CLR
8 ноя 11, 14:09    [11563660]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить