Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 удаление html тегов из текста  [new]
rawman
Member

Откуда: Москва
Сообщений: 24
задача простая, есть строка текста напичканная в том числе тегами, надо их убрать
думаю ерунда, да не тут-то было....

declare @sstr varchar(max)
declare @start int, @finish int
declare @wstr varchar(max)

set @sstr = '<p class="OPIS_DLD_BEG"><p class="OPIS_DLD_BEG"><b><font size="4">Показания.</font></b><font size="4"> Приборы равномерного распределения на 45</font></p>'

select @start = CHARINDEX('<', @sstr)
select @finish = CHARINDEX('>', @sstr)

while ((@start > 0) and (@finish > 0))
begin
	select @wstr = SUBSTRING(@sstr,@start, @finish)
	select @sstr = REPLACE(@sstr, @wstr, '')
	select @start = CHARINDEX('<', @sstr)
	select @finish = CHARINDEX('>', @sstr)
end

select @sstr


ожидаю получить:
Показания. Приборы равномерного распределения на 45

а получаю:
Показания.ры равномерного распределения на 45

полез в отладчик (слава богу он есть) и вижу что на третьем круге SUBSTRING сходит с ума и возвращает на порядок больше символов чем надо.
вопрос почему ?
или это у меня одного такой глюк ?
9 мар 15, 00:40    [17359495]     Ответить | Цитировать Сообщить модератору
 Re: удаление html тегов из текста  [new]
regexp,
Guest
rawman,

declare @sstr varchar(max)

set @sstr = '<p class="OPIS_DLD_BEG"><p class="OPIS_DLD_BEG"><b><font size="4">Показания.</font></b><font size="4"> Приборы равномерного распределения на 45</font></p>'

-------------------------------

declare @regexp int
declare @hr int
declare @result varchar(8000) 

exec @hr = sp_OACreate 'vbscript.regexp', @regexp output
exec @hr = sp_OASetProperty @regexp, 'Pattern', '<!*[^<>]*>'
exec @hr = sp_OASetProperty @regexp, 'Global', 1
exec @hr = sp_OASetProperty @regexp, 'IgnoreCase', 1
exec @hr = sp_OASetProperty @regexp, 'MultiLine', 1

exec @hr = sp_OAMethod @regexp, 'Replace', @result output, @sstr, ''

--print @sstr
print @result

Показания. Приборы равномерного распределения на 45


и, наверняка, тоже можно "красивше" сделать через CLR
точнее, churupaha, тут - FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...
уже всё сделал, нужно просто "пользовать" :)
9 мар 15, 01:17    [17359577]     Ответить | Цитировать Сообщить модератору
 Re: удаление html тегов из текста  [new]
rawman
Member

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

терпеть не могу регулярные выражения, я их не понимаю :-(
9 мар 15, 02:29    [17359741]     Ответить | Цитировать Сообщить модератору
 Re: удаление html тегов из текста  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
regexp,,

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454

rawman,

CLR+Html Agility Pack
9 мар 15, 03:02    [17359772]     Ответить | Цитировать Сообщить модератору
 Re: удаление html тегов из текста  [new]
aleks2
Guest
declare @sstr varchar(max)
declare @start int, @finish int

set @sstr = '<p class="OPIS_DLD_BEG"><p class="OPIS_DLD_BEG"><b><font size="4">Показания.</font></b><font size="4"> Приборы равномерного распределения на 45</font></p>'

select @start = CHARINDEX('<', @sstr)
select @finish = CHARINDEX('>', @sstr, @start )

while ((@start > 0) and (@finish > 0))
begin
	select @sstr = stuff(@sstr, @start, @finish - @start + 1, '')
	select @start = CHARINDEX('<', @sstr)
	select @finish = CHARINDEX('>', @sstr, @start )
end

select @sstr
9 мар 15, 07:29    [17359821]     Ответить | Цитировать Сообщить модератору
 Re: удаление html тегов из текста  [new]
aleks2
Guest
Впрочем, оригинал содержит банальную ошибку в
SUBSTRING(@sstr,@start, @finish)
надо
SUBSTRING(@sstr,@start, @finish-@start+1)


declare @sstr varchar(max)
declare @start int, @finish int
declare @wstr varchar(max)

set @sstr = '<p class="OPIS_DLD_BEG"><p class="OPIS_DLD_BEG"><b><font size="4">Показания.</font></b><font size="4"> Приборы равномерного распределения на 45</font></p>'

select @start = CHARINDEX('<', @sstr)
select @finish = CHARINDEX('>', @sstr, @start)

while ((@start > 0) and (@finish > 0))
begin
	select @wstr = SUBSTRING(@sstr,@start, @finish-@start+1)
	select @sstr = REPLACE(@sstr, @wstr, '')
	select @start = CHARINDEX('<', @sstr)
	select @finish = CHARINDEX('>', @sstr, @start)
end
9 мар 15, 07:44    [17359828]     Ответить | Цитировать Сообщить модератору
 Re: удаление html тегов из текста  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
1. Исходный *ML не валиден.
2. Для валидного:
declare @s1 varchar(max) = '<p class="OPIS_DLD_BEG"><b><font size="4">Показания.</font></b></p><p class="OPIS_DLD_BEG"><font size="4"> Приборы равномерного распределения на 45</font></p>';
declare @s2 varchar(max) = '<p class="OPIS_DLD_BEG"><b><font size="4">Показания.</font></b><font size="4"> Приборы равномерного распределения на 45</font></p>';

select
 cast(@s1 as xml).query('data(.)').value('.', 'varchar(max)'),
 cast(@s1 as xml).query('data(.)').value('.', 'varchar(max)');
9 мар 15, 09:56    [17359917]     Ответить | Цитировать Сообщить модератору
 Re: удаление html тегов из текста  [new]
regexp,
Guest
Сон Веры Павловны
regexp,,

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454
какие "страсти" творятся по ссылке! :)
Каждый раз, когда вы пытаетесь разобрать HTML с использованием регулярных выражений, нечестивый ребенок плачет кровью девственниц, а российские хакеры pwn свой веб-приложение.
9 мар 15, 12:12    [17360135]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить