एसक्यूएल सर्वर में एक स्ट्रिंग से HTML टैग्स को पट्टी करने का सबसे अच्छा तरीका?


112

मुझे SQL Server 2005 में डेटा मिला है जिसमें html टैग हैं और मैं टैग के बीच के पाठ को छोड़कर सभी को अलग करना चाहता हूं। आदर्श रूप से भी चीजों को प्रतिस्थापित &lt;करना <, आदि।

क्या ऐसा करने का एक आसान तरीका है या किसी को पहले से ही कुछ नमूना टी-एसक्यूएल कोड मिला है?

मेरे पास विस्तारित संग्रहीत प्रॉक्सेस और इस तरह जोड़ने की क्षमता नहीं है, इसलिए एक शुद्ध टी-एसक्यूएल दृष्टिकोण (अधिमानतः एक पीछे की तरफ 2000 वर्गमीटर के साथ संगत) को प्राथमिकता देगा।

मैं केवल HTML को छीनने के साथ डेटा को पुनः प्राप्त करना चाहता हूं, इसे अपडेट नहीं करता हूं, इसलिए आदर्श रूप से इसे आसानी से पुन: उपयोग करने के लिए, उपयोगकर्ता-परिभाषित फ़ंक्शन के रूप में लिखा जाएगा।

तो उदाहरण के लिए इसे परिवर्तित करना:

<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>

इसके लिए:

Some useful text > more text

जवाबों:


162

एक UDF है जो यहाँ वर्णित किया जाएगा:

उपयोगकर्ता परिभाषित फ़ंक्शन स्ट्रिप एचटीएमएल के लिए

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

संपादित करें: ध्यान दें कि यह SQL Server 2005 के लिए है, लेकिन यदि आप कीवर्ड MAX को 4000 जैसी चीज़ में बदलते हैं, तो यह SQL Server 2000 में भी काम करेगा।


9
बहुत धन्यवाद। टिप्पणियाँ वहाँ एक बेहतर संस्करण के लिए लिंक: lazycoders.blogspot.com/2007/06/… जो अधिक HTML संस्थाओं से संबंधित है।
रोरी

4
ध्यान दें कि SQL सर्वर 2005 या बाद में एक स्ट्रिंग-गहन UDF के रूप में, यह एक बड़े प्रदर्शन को बढ़ावा देने के लिए CLR UDF फ़ंक्शन को लागू करने के लिए एक आदर्श उम्मीदवार है । ऐसा करने के बारे में अधिक जानकारी यहाँ: stackoverflow.com/questions/34509/…
RedFilter

10
ध्यान दें कि lazycoders पोस्ट में दो टाइपो हैं। CHAR(13) + CHAR(10)इन दोनों खंडों में से दो के आसपास से एकल उद्धरण निकालें । पर्याप्त रूप से मैंने इसे तब तक नहीं पकड़ा जब तक यह एक छोटे क्षेत्र की लंबाई से अधिक नहीं हो गया (दिलचस्प रूप से, और मेरे लिए आवश्यक है, सभी प्रतिस्थापन मूल स्ट्रिंग से कम हैं)।
goodeye

1
HTML एनकोडेड वैल्यू के बारे में क्या? उन्हें डिकोड करने की आवश्यकता होगी। धन्यवाद।
JDPeckham

2
मैंने lazycoders का उपयोग किया, साथ ही ऊपर @goodeye से टाइपो फिक्स - महान काम करता है। समय बचाने के लिए, lazycoders ब्लॉग संस्करण यहाँ है: lazycoders.blogspot.com/2007/06/…
qxotk

18

@Goner डग जवाब से व्युत्पन्न, कुछ चीजों को अद्यतन करने के साथ:
- जहाँ संभव हो REPLACE का उपयोग करते हुए
- पूर्वनिर्धारित संस्थाओं के रूपांतरण &eacute;( जैसे मैंने जिनको मेरी ज़रूरत थी उन्हें चुना :-)
- सूची टैग के कुछ रूपांतरण<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
मैंने इसका उपयोग किया है और इसे प्यार करता हूं, लेकिन मैंने शीर्ष समूह में एक और स्थान जोड़ दिया है: </ p> मैं एक चर 13 + char 10 में बदल गया, क्योंकि एक पैराग्राफ टैग के अंत में आम तौर पर एक नई लाइन का संकेत होगा। यह पूरी तरह से मेरे विशेष परिदृश्य में काम करता है
DR

1
इस उत्तर ने अधिकांश भाग के लिए बहुत अच्छा काम किया, लेकिन एक धारणा है कि आपके सभी HTML टैग मान्य हैं। मेरे मामले में, VARCHAR अपलोड पर ट्रंकेशन मुद्दा था जिसने कुछ समापन टैग समाप्त कर दिए। एक साधारण PATINDEX RTrim ने बाकी सब चीजों को हटाने की चाल चली।
मैट 123788

2
बदलाव के अलावा @DR (कुछ और जो कि गाड़ी के रिटर्न की जरूरत थी) के अलावा, मैंने उन नतीजों को भी स्थानांतरित कर दिया, जिसके परिणामस्वरूप <और >बहुत अंत तक। अन्यथा वे टैग के साथ हटा दिए गए।
a_hardin

8

यदि आपका HTML अच्छी तरह से बना है, तो मुझे लगता है कि यह एक बेहतर उपाय है:

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
इसने मेरे लिए काम किया। +1। लेकिन क्या आप कृपया अपने कोड की व्याख्या कर सकते हैं, ताकि डेवलपर्स इसे अधिक आसानी से समझ सकें? :)
सईद नेमाती

ऐसा लगता है कि यह html को एक xml दस्तावेज़ के रूप में लोड करता है, फिर इसमें से सभी मानों का चयन करता है। नोट: यह कोड & nbsp;
जेडीपीकेहम

2
HTML कोड्स पर बमबारी न करने के लिए हैक लगाएं। जाहिर है कि इन-हाउस उपयोग या जो कुछ भी (जैसे यूडीएफ स्वीकार किया गया है) के लिए सिर्फ एक त्वरित हैक।
dudeNumber4

इसका गठन अच्छी तरह से किया जाना है, इसलिए यह RedFilter के रूप में दोष सहिष्णु नहीं है।
मीका बी।

1
HTML XML का सबसेट नहीं है। XHTML है, लेकिन HTML उस सड़क के नीचे नहीं है।
डेविड

7

यहां इस फ़ंक्शन का एक अपडेटेड संस्करण है जिसमें LazyCoders परिवर्धन और Goodeye टाइपो सुधार के साथ RedFilter उत्तर (Pinal का मूल) शामिल है और <STYLE>HTML के अंदर इन-लाइन टैग को संभालने के लिए मेरा खुद का जोड़ है ।

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
मेरी जानकारी के लिए, किसी भी कारण के STUFF()बजाय REPLACE()(जो woudl हो कम आईएमओ हो) का उपयोग कर?
पैट्रिक होनोरेज

मैं वास्तव में इसके बारे में नहीं सोचा था। जैसा कि मैंने संकेत दिया, मैंने मूल रूप से कॉपी / संशोधित किया। प्रतिस्थापन बहुत अच्छी तरह से एक बेहतर विकल्प हो सकता है। मुझे आश्चर्य है कि अगर विचार करने के लिए दो कार्यों के बीच एक प्रदर्शन तुलना है ...
गनर डग

1
इसके लिए @GonerDoug चीयर्स कर रहा था, स्वीकृत टिप्पणियों के माध्यम से पढ़ रहा था, यह वास्तव में अपडेट करने की आवश्यकता है।
जोनो

4

यह एक नया समाधान नहीं है, लेकिन afwebservant समाधान के लिए एक सुधार है :

--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  

यह मेरे लिए काम करने के बाद मैंने varchar के बजाय nvarchar का उपयोग किया क्योंकि मैं html टैग के अंदर यूनिकोड वर्णों का उपयोग करता हूं
Shadi Namrouti

3

इसे इस्तेमाल करे। यह RedFilter द्वारा पोस्ट किए गए एक का संशोधित संस्करण है ... यह SQL BR, B, और P को छोड़कर किसी भी विशेषता के साथ सभी टैग हटा देती है:

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

मेरे लिए सेलेक्ट dbo.StripHtml ('<b> somestuff </ b>') काम नहीं किया; उस सटीक स्ट्रिंग को लौटाता है
19

@ladieu, यह अपेक्षित है। उत्तर की पहली पंक्ति की जांच करें ("यह SQL BR, B, और P को छोड़कर किसी भी विशेषता के साथ सभी टैग हटाता है")।
पीटर हेरडेनबर्ग

यह SQL फ़ंक्शन गलत है। कृपया सही फ़ंक्शन के लिए नीचे दिए गए उत्तर को देखें।
Futureelite7

@ Futureelite7 "SO" और "उपरोक्त" का उपयोग करते हुए एक संदर्भ के रूप में जहां SO पृष्ठ पर उत्तर ढूंढना निरर्थक है, क्योंकि शीर्ष पर टैब का उपयोग करके उत्तर क्रम को बदला जा सकता है (और इससे भी अधिक, मतदान उत्तर क्रम बदल सकता है)। कृपया इसे पोस्ट करने वाले लेखक के नाम का उपयोग करके एक उत्तर निर्दिष्ट करें
कायुस जार्ड

3

कैसे एक लाइनर के साथ XQuery का उपयोग करने के बारे में:

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

यह सभी तत्वों से गुजरता है और केवल पाठ () लौटाता है।

रिक्त स्थान के बिना कंक्रीटिंग तत्वों के बीच पाठ से बचने के लिए, उपयोग करें:

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))

और "आप इसका उपयोग कॉलम के लिए कैसे करते हैं:"

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

उपरोक्त कोड के लिए, सुनिश्चित करें कि आपका html_columnडेटा प्रकार है xml, यदि नहीं, तो आपको HTML के एक जातिगत संस्करण को सहेजने की आवश्यकता है xml। जब आप HTML डेटा लोड कर रहे हों, तो मैं इसे एक अलग अभ्यास के रूप में करूंगा, क्योंकि SQL एक त्रुटि फेंक देगा यदि यह विकृत xml, जैसे बेमेल प्रारंभ / समाप्ति टैग, अमान्य वर्ण पाता है।

जब आप seachh वाक्यांशों का निर्माण करना चाहते हैं तो उत्कृष्ट हैं, HTML, स्ट्रिप HTML आदि।

बस ध्यान दें कि यह रिटर्न टाइप करता है xml, इसलिए CAST या COVERT को पाठ में जहां उपयुक्त हो। इस डेटा प्रकार का xml संस्करण बेकार है, क्योंकि यह एक अच्छी तरह से गठित XML नहीं है।


वास्तविक समाधान के बिना xml से कास्ट करने के लिए मुझे ऐसा लगता है कि यह सबसे अच्छा आंशिक समाधान है।
डेनिस जहरुद्दीन

CAST (@xml varchar (अधिकतम))। या CONVERT (xml), @ XML)। माना जाता है कि ज्यादातर डेवलपर्स इसका पता लगा लेते हैं।
अरविन अमीर

1
यह निश्चित रूप से उचित है कि डेवलपर्स जानते हैं कि कैसे डालना है, लेकिन ध्यान रखें कि आपके उत्तर को पढ़ने वाला कोई व्यक्ति सीधे यह नहीं देख सकता है कि 'बस' कास्टिंग वह सब है जिसे करने की आवश्यकता है। विशेष रूप से क्योंकि यह उल्लेख किया गया है कि हम जहां उपयुक्त हो वहां डाल सकते हैं । - मैं नकारात्मक होने की कोशिश नहीं कर रहा हूं, बस आशा है कि यह आपको उन उत्तरों के निर्माण में मदद करता है जो उपयोगी होने के रूप में पहचानने में अधिक आसान हैं!
डेनिस जहरुद्दीन

तो कॉलम का नाम क्या है? आइए कहते हैं कि मेरे पास एक dataकॉलम है जिसे कॉल किया गया कॉलम कहा जाता है htmlऔर मैं उस कॉलम में सभी मानों का चयन करना चाहता हूं, लेकिन html टैग्स को स्ट्रिप करें मैं इसे प्राप्त करने के लिए आपके उत्तर का उपयोग कैसे कर सकता हूं?
फेलिक्स ईव

2

यहां एक ऐसा संस्करण है जिसे UDF की आवश्यकता नहीं है और यह तब भी काम करता है जब HTML में टैग बंद किए बिना टैग शामिल हों।

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

1

जबकि अरविन आमिर का जवाब एक पूर्ण-पंक्ति समाधान के करीब आता है जिसे आप कहीं भी छोड़ सकते हैं; उन्हें अपने चुनिंदा बयान (लाइन के अंत को याद करते हुए) में थोड़ी सी बग मिली, और मैं सबसे आम चरित्र संदर्भों को संभालना चाहता था।

मैंने जो किया वह यह था:

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]

चरित्र संदर्भ कोड के बिना इसे सरल बनाया जा सकता है:

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

0

पैट्रिक होनोरेज़ कोड में थोड़े बदलाव की जरूरत है।

यह HTML के लिए अपूर्ण परिणाम देता है जिसमें सम्‍मिलित है &lt;या&gt;

ऐसा इसलिए है क्योंकि अनुभाग के नीचे कोड है

- टैग के बीच कुछ भी निकालें

वास्तव में कुछ भी नहीं की जगह लेगा <। नीचे के अंत में दो पंक्तियों को लागू करने के लिए फिक्स है:

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.