Html etiketlerini sql sunucusundaki bir dizeden çıkarmanın en iyi yolu?


112

SQL Server 2005'te html etiketleri içeren verilerim var ve bunların hepsini etiketlerin arasında bırakarak tüm bunları çıkarmak istiyorum. İdeal da gibi şeyler yerine &lt;birlikte< , vb

Bunu yapmanın kolay bir yolu var mı yoksa birisinin örnek t-sql kodu zaten var mı?

Uzatılmış depolanmış prosedürler ve benzerlerini ekleme yeteneğim yok, bu yüzden saf bir t-sql yaklaşımını tercih ederim (tercihen sql 2000 ile geriye doğru uyumlu).

Verileri yalnızca ayıklanmış html ile almak istiyorum, güncellemek değil, bu yüzden ideal olarak, kolay yeniden kullanımı sağlamak için kullanıcı tanımlı bir işlev olarak yazılmalıdır.

Örneğin, bunu dönüştürmek:

<B>Some useful text</B>&nbsp;
<A onclick="return openInfo(this)"
   href="http://there.com/3ce984e88d0531bac5349"
   target=globalhelp>
   <IMG title="Source Description" height=15 alt="Source Description" 
        src="/ri/new_info.gif" width=15 align=top border=0>
</A>&gt;&nbsp;<b>more text</b></TD></TR>

buna:

Some useful text > more text

Yanıtlar:


162

Burada anlatılanları yapacak bir UDF var:

HTML'yi Çıkarmak için Kullanıcı Tanımlı İşlev

CREATE FUNCTION [dbo].[udf_StripHTML] (@HTMLText VARCHAR(MAX))
RETURNS VARCHAR(MAX) AS
BEGIN
    DECLARE @Start INT
    DECLARE @End INT
    DECLARE @Length INT
    SET @Start = CHARINDEX('<',@HTMLText)
    SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText))
    SET @Length = (@End - @Start) + 1
    WHILE @Start > 0 AND @End > 0 AND @Length > 0
    BEGIN
        SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'')
        SET @Start = CHARINDEX('<',@HTMLText)
        SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText))
        SET @Length = (@End - @Start) + 1
    END
    RETURN LTRIM(RTRIM(@HTMLText))
END
GO

Düzenleme: Bunun SQL Server 2005 için olduğunu unutmayın, ancak MAX anahtar kelimesini 4000 gibi bir şeye değiştirirseniz, SQL Server 2000'de de çalışacaktır.


9
Çok teşekkürler. Buradaki yorumlar, geliştirilmiş bir sürüme bağlantılıdır: lazycoders.blogspot.com/2007/06/… , daha fazla html varlığıyla ilgilenir.
Rory

4
SQL Server 2005 veya sonraki sürümlerinde dizi yoğun bir UDF olarak, bunun, büyük bir performans artışı için bir CLR UDF işlevi uygulamak için mükemmel bir aday olduğunu unutmayın . Bunu yapmakla ilgili daha fazla bilgiyi burada bulabilirsiniz: stackoverflow.com/questions/34509/…
RedFilter

10
Lazycoders gönderisinin iki yazım hatası olduğunu unutmayın. CHAR(13) + CHAR(10)Bunlara sahip iki bölümde etrafındaki tek tırnak işaretlerini kaldırın . Yeterince ince, kısa bir alanın uzunluğunu aşana kadar yakalayamadım (ilginçtir ve benim için gerekli, tüm değiştirmeler orijinal dizeden daha kısadır).
goodeye

1
Peki ya html kodlu değerler? bunların deşifre edilmesi gerekir. Teşekkürler.
JDPeckham

2
Tembel kodlayıcıları ve ayrıca yukarıdaki @ goodeye'daki yazım hatası düzeltmesini kullandım - harika çalışıyor. Zaman kazanmak için, lazycoders blog sürümü burada: lazycoders.blogspot.com/2007/06/…
qxotk

18

@Goner Doug cevabından türetilmiştir, birkaç şey güncellenmiştir:
- Mümkün olduğunda DEĞİŞTİRİN kullanılarak
- &eacute;(İhtiyacım olanları seçtim :-) gibi önceden tanımlanmış varlıkların
dönüşümü - liste etiketlerinin bazı dönüşümü<ul> and <li>

ALTER FUNCTION [dbo].[udf_StripHTML]
--by Patrick Honorez --- www.idevlop.com
--inspired by http://stackoverflow.com/questions/457701/best-way-to-strip-html-tags-from-a-string-in-sql-server/39253602#39253602
(
@HTMLText varchar(MAX)
)
RETURNS varchar(MAX)
AS
BEGIN
DECLARE @Start  int
DECLARE @End    int
DECLARE @Length int

set @HTMLText = replace(@htmlText, '<br>',CHAR(13) + CHAR(10))
set @HTMLText = replace(@htmlText, '<br/>',CHAR(13) + CHAR(10))
set @HTMLText = replace(@htmlText, '<br />',CHAR(13) + CHAR(10))
set @HTMLText = replace(@htmlText, '<li>','- ')
set @HTMLText = replace(@htmlText, '</li>',CHAR(13) + CHAR(10))

set @HTMLText = replace(@htmlText, '&rsquo;' collate Latin1_General_CS_AS, ''''  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&quot;' collate Latin1_General_CS_AS, '"'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&amp;' collate Latin1_General_CS_AS, '&'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&euro;' collate Latin1_General_CS_AS, '€'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&lt;' collate Latin1_General_CS_AS, '<'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&gt;' collate Latin1_General_CS_AS, '>'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&oelig;' collate Latin1_General_CS_AS, 'oe'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&nbsp;' collate Latin1_General_CS_AS, ' '  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&copy;' collate Latin1_General_CS_AS, '©'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&laquo;' collate Latin1_General_CS_AS, '«'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&reg;' collate Latin1_General_CS_AS, '®'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&plusmn;' collate Latin1_General_CS_AS, '±'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&sup2;' collate Latin1_General_CS_AS, '²'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&sup3;' collate Latin1_General_CS_AS, '³'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&micro;' collate Latin1_General_CS_AS, 'µ'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&middot;' collate Latin1_General_CS_AS, '·'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&ordm;' collate Latin1_General_CS_AS, 'º'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&raquo;' collate Latin1_General_CS_AS, '»'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&frac14;' collate Latin1_General_CS_AS, '¼'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&frac12;' collate Latin1_General_CS_AS, '½'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&frac34;' collate Latin1_General_CS_AS, '¾'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&Aelig' collate Latin1_General_CS_AS, 'Æ'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&Ccedil;' collate Latin1_General_CS_AS, 'Ç'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&Egrave;' collate Latin1_General_CS_AS, 'È'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&Eacute;' collate Latin1_General_CS_AS, 'É'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&Ecirc;' collate Latin1_General_CS_AS, 'Ê'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&Ouml;' collate Latin1_General_CS_AS, 'Ö'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&agrave;' collate Latin1_General_CS_AS, 'à'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&acirc;' collate Latin1_General_CS_AS, 'â'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&auml;' collate Latin1_General_CS_AS, 'ä'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&aelig;' collate Latin1_General_CS_AS, 'æ'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&ccedil;' collate Latin1_General_CS_AS, 'ç'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&egrave;' collate Latin1_General_CS_AS, 'è'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&eacute;' collate Latin1_General_CS_AS, 'é'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&ecirc;' collate Latin1_General_CS_AS, 'ê'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&euml;' collate Latin1_General_CS_AS, 'ë'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&icirc;' collate Latin1_General_CS_AS, 'î'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&ocirc;' collate Latin1_General_CS_AS, 'ô'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&ouml;' collate Latin1_General_CS_AS, 'ö'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&divide;' collate Latin1_General_CS_AS, '÷'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&oslash;' collate Latin1_General_CS_AS, 'ø'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&ugrave;' collate Latin1_General_CS_AS, 'ù'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&uacute;' collate Latin1_General_CS_AS, 'ú'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&ucirc;' collate Latin1_General_CS_AS, 'û'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&uuml;' collate Latin1_General_CS_AS, 'ü'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&quot;' collate Latin1_General_CS_AS, '"'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&amp;' collate Latin1_General_CS_AS, '&'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&lsaquo;' collate Latin1_General_CS_AS, '<'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&rsaquo;' collate Latin1_General_CS_AS, '>'  collate Latin1_General_CS_AS)


-- Remove anything between <STYLE> tags
SET @Start = CHARINDEX('<STYLE', @HTMLText)
SET @End = CHARINDEX('</STYLE>', @HTMLText, CHARINDEX('<', @HTMLText)) + 7
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '')
SET @Start = CHARINDEX('<STYLE', @HTMLText)
SET @End = CHARINDEX('</STYLE>', @HTMLText, CHARINDEX('</STYLE>', @HTMLText)) + 7
SET @Length = (@End - @Start) + 1
END

-- Remove anything between <whatever> tags
SET @Start = CHARINDEX('<', @HTMLText)
SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '')
SET @Start = CHARINDEX('<', @HTMLText)
SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
SET @Length = (@End - @Start) + 1
END

RETURN LTRIM(RTRIM(@HTMLText))

END

4
Bunu kullandım ve çok beğendim, ancak üst gruba bir değişiklik daha ekledim: </p> Bir paragraf etiketinin sonu tipik olarak yeni bir satırı göstereceği için bir char 13 + char 10 olarak değiştirdim. Benim özel senaryomda mükemmel çalıştı
DR

1
Bu cevap çoğunlukla harika çalıştı, ancak tüm HTML etiketlerinizin geçerli olduğu varsayımı var. Benim durumumda, VARCHAR yüklemesinde bazı kapanış etiketlerini ortadan kaldıran bir kesme sorunu vardı. Basit bir PATINDEX RTrim, diğer her şeyi kaldırmak için hile yaptı.
matt123788

2
Yapılan değişiklik @DR (artı birkaç daha o gerekli satır başları) ek olarak, ben de yerine geçer de sonucu olduğunu taşındı <ve >sonuna kadar. Aksi takdirde etiketlerle birlikte kaldırıldılar.
a_hardin

8

HTML'niz iyi biçimlendirilmişse, bunun daha iyi bir çözüm olduğunu düşünüyorum:

create function dbo.StripHTML( @text varchar(max) ) returns varchar(max) as
begin
    declare @textXML xml
    declare @result varchar(max)
    set @textXML = REPLACE( @text, '&', '' );
    with doc(contents) as
    (
        select chunks.chunk.query('.') from @textXML.nodes('/') as chunks(chunk)
    )
    select @result = contents.value('.', 'varchar(max)') from doc
    return @result
end
go

select dbo.StripHTML('This <i>is</i> an <b>html</b> test')

1
Bu benim için çalıştı. +1. Ancak geliştiricilerin daha kolay anlayabilmesi için kodunuzu açıklar mısınız? :)
Saeed Neamati

html'yi bir xml belgesi olarak yüklüyor gibi görünüyor ve ardından içindeki tüm değerleri seçiyor. Not: Bu kod, & nbsp;
JDPeckham

2
HTML kodlarını bombalamamak için bir hack koyun. Açıkçası, şirket içi kullanım veya her neyse (kabul edilen UDF'de olduğu gibi) için hızlı bir hack.
dudeNumber4

İyi biçimlendirilmiş olması gerekir, bu nedenle RedFilter'ınki kadar hataya dayanıklı değildir.
Micah B.

1
HTML, XML'in bir alt kümesi değildir. XHTML öyle, ancak HTML artık o yola girmiyor.
David

7

RedFilter cevabını (Pinal'in orijinali) LazyCoders eklemeleriyle ve iyi göz yazım hatası düzeltmeleriyle <STYLE>ve HTML içindeki satır içi etiketleri işlemek için kendi eklememle birleştiren bu işlevin güncellenmiş bir sürümü burada .

ALTER FUNCTION [dbo].[udf_StripHTML]
(
@HTMLText varchar(MAX)
)
RETURNS varchar(MAX)
AS
BEGIN
DECLARE @Start  int
DECLARE @End    int
DECLARE @Length int

-- Replace the HTML entity &amp; with the '&' character (this needs to be done first, as
-- '&' might be double encoded as '&amp;amp;')
SET @Start = CHARINDEX('&amp;', @HTMLText)
SET @End = @Start + 4
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '&')
SET @Start = CHARINDEX('&amp;', @HTMLText)
SET @End = @Start + 4
SET @Length = (@End - @Start) + 1
END

-- Replace the HTML entity &lt; with the '<' character
SET @Start = CHARINDEX('&lt;', @HTMLText)
SET @End = @Start + 3
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '<')
SET @Start = CHARINDEX('&lt;', @HTMLText)
SET @End = @Start + 3
SET @Length = (@End - @Start) + 1
END

-- Replace the HTML entity &gt; with the '>' character
SET @Start = CHARINDEX('&gt;', @HTMLText)
SET @End = @Start + 3
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '>')
SET @Start = CHARINDEX('&gt;', @HTMLText)
SET @End = @Start + 3
SET @Length = (@End - @Start) + 1
END

-- Replace the HTML entity &amp; with the '&' character
SET @Start = CHARINDEX('&amp;amp;', @HTMLText)
SET @End = @Start + 4
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '&')
SET @Start = CHARINDEX('&amp;amp;', @HTMLText)
SET @End = @Start + 4
SET @Length = (@End - @Start) + 1
END

-- Replace the HTML entity &nbsp; with the ' ' character
SET @Start = CHARINDEX('&nbsp;', @HTMLText)
SET @End = @Start + 5
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, ' ')
SET @Start = CHARINDEX('&nbsp;', @HTMLText)
SET @End = @Start + 5
SET @Length = (@End - @Start) + 1
END

-- Replace any <br> tags with a newline
SET @Start = CHARINDEX('<br>', @HTMLText)
SET @End = @Start + 3
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, CHAR(13) + CHAR(10))
SET @Start = CHARINDEX('<br>', @HTMLText)
SET @End = @Start + 3
SET @Length = (@End - @Start) + 1
END

-- Replace any <br/> tags with a newline
SET @Start = CHARINDEX('<br/>', @HTMLText)
SET @End = @Start + 4
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, CHAR(13) + CHAR(10))
SET @Start = CHARINDEX('<br/>', @HTMLText)
SET @End = @Start + 4
SET @Length = (@End - @Start) + 1
END

-- Replace any <br /> tags with a newline
SET @Start = CHARINDEX('<br />', @HTMLText)
SET @End = @Start + 5
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, CHAR(13) + CHAR(10))
SET @Start = CHARINDEX('<br />', @HTMLText)
SET @End = @Start + 5
SET @Length = (@End - @Start) + 1
END

-- Remove anything between <STYLE> tags
SET @Start = CHARINDEX('<STYLE', @HTMLText)
SET @End = CHARINDEX('</STYLE>', @HTMLText, CHARINDEX('<', @HTMLText)) + 7
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '')
SET @Start = CHARINDEX('<STYLE', @HTMLText)
SET @End = CHARINDEX('</STYLE>', @HTMLText, CHARINDEX('</STYLE>', @HTMLText)) + 7
SET @Length = (@End - @Start) + 1
END

-- Remove anything between <whatever> tags
SET @Start = CHARINDEX('<', @HTMLText)
SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
SET @Length = (@End - @Start) + 1

WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '')
SET @Start = CHARINDEX('<', @HTMLText)
SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
SET @Length = (@End - @Start) + 1
END

RETURN LTRIM(RTRIM(@HTMLText))

END

1
Benim bilgim için STUFF(), yerine herhangi bir sebep kullanmak REPLACE()(hangisi daha kısa IMO olabilir)?
Patrick Honorez

Bunun hakkında gerçekten düşünmemiştim. Orijinali belirtildiği gibi kopyaladım / değiştirdim. Değiştirmek daha iyi bir seçenek olabilir. İki işlev arasında dikkate alınması gereken bir performans karşılaştırması olup olmadığını merak ediyorum ...
Goner Doug

1
@GonerDoug bunun için alkışlıyor, kabul edilen yorumları okuyordu, gerçekten güncellenmesi gerekiyor.
Jono

4

Bu tamamen yeni bir çözüm değil, afwebservant'ın çözümü için bir düzeltmedir :

--note comments to see the corrections

CREATE FUNCTION [dbo].[StripHTML] (@HTMLText VARCHAR(MAX))  
RETURNS VARCHAR(MAX)  
AS  
BEGIN  
 DECLARE @Start  INT  
 DECLARE @End    INT  
 DECLARE @Length INT  
 --DECLARE @TempStr varchar(255) (this is not used)  

 SET @Start = CHARINDEX('<',@HTMLText)  
 SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText))  
 SET @Length = (@End - @Start) + 1  

 WHILE @Start > 0 AND @End > 0 AND @Length > 0  
 BEGIN  
   IF (UPPER(SUBSTRING(@HTMLText, @Start, 4)) <> '<BR>') AND (UPPER(SUBSTRING(@HTMLText, @Start, 5)) <> '</BR>')  
    begin  
      SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'')  
      end  
-- this ELSE and SET is important
   ELSE  
      SET @Length = 0;  

-- minus @Length here below is important
   SET @Start = CHARINDEX('<',@HTMLText, @End-@Length)  
   SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText, @Start))  
-- instead of -1 it should be +1
   SET @Length = (@End - @Start) + 1  
 END  

 RETURN RTRIM(LTRIM(@HTMLText))  
END  

Html etiketlerinde unicode karakterleri kullandığım için varchar yerine nvarchar kullandıktan sonra bu benim için çalıştı
Shadi Namrouti

3

Bunu dene. RedFilter tarafından gönderilenin değiştirilmiş bir sürümüdür ... bu SQL BR, B ve P dışındaki tüm etiketleri, eşlik eden özniteliklerle kaldırır:

CREATE FUNCTION [dbo].[StripHtml] (@HTMLText VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
 DECLARE @Start  INT
 DECLARE @End    INT
 DECLARE @Length INT
 DECLARE @TempStr varchar(255)

 SET @Start = CHARINDEX('<',@HTMLText)
 SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText))
 SET @Length = (@End - @Start) + 1

 WHILE @Start > 0 AND @End > 0 AND @Length > 0
 BEGIN
   IF (UPPER(SUBSTRING(@HTMLText, @Start, 3)) <> '<BR') AND (UPPER(SUBSTRING(@HTMLText, @Start, 2)) <> '<P') AND (UPPER(SUBSTRING(@HTMLText, @Start, 2)) <> '<B') AND (UPPER(SUBSTRING(@HTMLText, @Start, 3)) <> '</B')
   BEGIN
      SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'')
   END

   SET @Start = CHARINDEX('<',@HTMLText, @End)
   SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText, @Start))
   SET @Length = (@End - @Start) - 1
 END

 RETURN RTRIM(LTRIM(@HTMLText))
END

benim için çalışmadı SELECT dbo.StripHtml ('<b> somestuff </b>'); tam dizeyi döndürür
bayan

@ladieu, bu bekleniyor. Cevabın ilk satırını kontrol edin ("bu SQL BR, B ve P dışındaki tüm etiketleri eşlik eden özniteliklerle kaldırır").
Peter Herdenborg

bu SQL işlevi yanlış. Düzeltilmiş işlev için lütfen aşağıdaki yanıta bakın.
futureelite7

@ futureelite7'nin bir SO sayfasında yanıtların nerede bulunacağına ilişkin referans olarak "aşağı" ve "yukarıyı" kullanması anlamsızdır, çünkü yanıt sırası üstteki sekmeler kullanılarak değiştirilebilir (ve dahası, oylama yanıt sırasını değiştirebilir). Lütfen gönderen yazarın adını kullanarak bir cevap belirtin
Caius Jard

3

XQuery'yi tek satırda kullanmaya ne dersiniz:

DECLARE @MalformedXML xml, @StrippedText varchar(max)
SET @MalformedXML = @xml.query('for $x in //. return ($x)//text()')
SET @StrippedText = CAST(@MalformedXML as varchar(max))

Bu, tüm öğeler arasında döngü oluşturur ve yalnızca text () öğesini döndürür.

Öğeler arasında boşluk bırakmadan birbirine geçen metinlerden kaçınmak için şunları kullanın:

DECLARE @MalformedXML xml, @StrippedText varchar(max)
SET @MalformedXML = @xml.query('for $x in //. return concat((($x)//text())[1]," ")')
SET @StrippedText = CAST(@MalformedXML as varchar(max))

Ve "Bunu bir sütun için nasıl kullanıyorsunuz:

  SELECT CAST(html_column.query('for $x in //. return concat((($x)//text()) as varchar(max))
  FROM table

Yukarıdaki kod için html_column, veri türünüzün olduğundan emin olun , xmldeğilse, html'nin dökümlü bir sürümünü olarak kaydetmeniz gerekir xml. Bunu HTML verilerini yüklerken ayrı bir alıştırma olarak yapacağım, çünkü SQL hatalı biçimlendirilmiş xml bulursa bir hata atar, örneğin uyumsuz başlangıç ​​/ bitiş etiketleri, geçersiz karakterler.

Bunlar, arama cümleleri oluşturmak, HTML'yi çıkarmak, vb. İçin mükemmeldir.

Bunun xml türünü döndürdüğünü unutmayın, bu nedenle uygun olduğunda metne CAST veya COVERT. Bu veri türünün xml sürümü, iyi biçimlendirilmiş bir XML olmadığı için işe yaramaz.


Xml'den gerçek bir çözüm olmadan, bunun en iyi ihtimalle kısmi bir çözüm olduğunu düşünüyorum.
Dennis Jaheruddin

CAST (@xml varchar olarak (maks.)). Veya CONVERT (xml), @XML). Çoğu geliştiricinin bunu çözeceği varsayılıyordu.
Arvin Amir

1
Geliştiricilerin nasıl yayın yapacaklarını bildiklerini varsaymak kesinlikle mantıklıdır, ancak cevabınızı okuyan birinin yapılması gereken tek şeyin "basitçe" yayınlama olduğunu doğrudan göremeyebileceğini unutmayın. Özellikle uygun olan yerlerde cast yapabileceğimizden bahsediliyor . - Olumsuz olmaya çalışmıyorum, umarım bu, yararlı olarak daha kolay anlaşılan yanıtlar oluşturmanıza yardımcı olur!
Dennis Jaheruddin

Peki sütun adı bunun neresi? Diyelim ki, adı verilen databir sütun içeren bir tablom var htmlve bu sütundaki tüm değerleri seçmek, ancak html etiketlerini çıkarmak istiyorum, cevabınızı bunu başarmak için nasıl kullanabilirim?
Felix Eve

2

Burada, bir UDF gerektirmeyen ve HTML, kapanış etiketleri eşleşmeyen etiketler içerse bile çalışan bir sürümdür.

TRY_CAST(REPLACE(REPLACE(REPLACE([HtmlCol], '>', '/> '), '</', '<'), '--/>', '-->') AS XML).value('.', 'NVARCHAR(MAX)')

1

Arvin Amir'in cevabı, her yerde uğrayabileceğiniz tam tek satırlık bir çözüme yaklaşsa da; Seçilmiş ifadesinde küçük bir hata var (satırın sonunu kaçırıyor) ve en yaygın karakter referanslarını ele almak istedim.

Sonunda yaptığım şey şuydu:

SELECT replace(replace(replace(CAST(CAST(replace([columnNameHere], '&', '&amp;') as xml).query('for $x in //. return concat((($x)//text())[1]," ")') as varchar(max)), '&amp;', '&'), '&nbsp;', ' '), '&#x20;', ' ')
FROM [tableName]

Karakter referans kodu olmadan şu şekilde basitleştirilebilir:

SELECT CAST(CAST([columnNameHere] as xml).query('for $x in //. return concat((($x)//text())[1]," ")') as varchar(max))
FROM [tableName]

0

Patrick Honorez kodunun küçük bir değişikliğe ihtiyacı var.

İçeren html için eksik sonuçlar döndürür &lt;Veya&gt;

Bunun nedeni, bölümün altındaki kodun

- Etiketler arasındaki her şeyi kaldırın

aslında <> 'i sıfıra değiştirecektir. Düzeltme, aşağıdaki iki satırı sonunda uygulamaktır:

set @HTMLText = replace(@htmlText, '&lt;' collate Latin1_General_CS_AS, '<'  collate Latin1_General_CS_AS)
set @HTMLText = replace(@htmlText, '&gt;' collate Latin1_General_CS_AS, '>'  collate Latin1_General_CS_AS)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.