SQL Server의 문자열에서 HTML 태그를 제거하는 가장 좋은 방법은 무엇입니까?


112

SQL Server 2005에 html 태그가 포함 된 데이터가 있는데 태그 사이에 텍스트 만 남기고 모든 것을 제거하고 싶습니다. 이상적으로도 같은 일을 대체 &lt;<등,

이 작업을 쉽게 수행 할 수있는 방법이 있습니까? 아니면 누군가 이미 샘플 t-sql 코드를 가지고 있습니까?

확장 된 저장 프로 시저 등을 추가 할 수있는 능력이 없으므로 순수한 t-sql 접근 방식을 선호합니다 (가급적이면 SQL 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가 있습니다.

HTML을 제거하는 사용자 정의 함수

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 엔티티를 다룹니다.
Rory

4
SQL Server 2005 이상에서 문자열 집약적 인 UDF로서, 이것은 엄청난 성능 향상을 위해 CLR UDF 기능구현하기에 완벽한 후보입니다 . 이에 대한 자세한 정보 : stackoverflow.com/questions/34509/…
RedFilter

10
lazycoders 게시물에는 두 개의 오타가 있습니다. CHAR(13) + CHAR(10)이러한 부분이있는 두 섹션 에서 주위의 작은 따옴표를 제거하십시오 . 충분히 미묘하게 나는 그것이 짧은 필드의 길이를 초과 할 때까지 그것을 잡지 못했습니다 (흥미롭게도 모든 교체가 원래 문자열보다 짧습니다).
goodeye

1
HTML 인코딩 값은 어떻습니까? 디코딩이 필요합니다. 감사.
JDPeckham

2
나는 lazycoder와 위의 @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> 단락 태그의 끝이 일반적으로 새 줄을 나타낼 것이기 때문에 나는 char 13 + char 10으로 변경했다. 내 특정 시나리오에서 완벽하게 작동했습니다
DR

1
이 답변은 대부분 훌륭하게 작동했지만 모든 HTML 태그가 유효하다는 가정이 있습니다. 제 경우에는 일부 닫는 태그를 제거하는 VARCHAR 업로드에 잘림 문제가있었습니다. 간단한 PATINDEX RTrim은 다른 모든 것을 제거하는 트릭을 수행했습니다.
matt123788

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. 하지만 개발자가 더 쉽게 이해할 수 있도록 코드를 설명해 주시겠습니까? :)
사이드 Neamati

html을 xml 문서로로드 한 다음 모든 값을 선택하는 것처럼 보입니다. 참고 :이 코드는 & nbsp;
JDPeckham

2
HTML 코드를 폭격하지 않기 위해 해킹하십시오. 분명히 사내 사용을위한 빠른 해킹 일뿐입니다 (허용되는 UDF와 마찬가지로).
dudeNumber4

잘 형성되어야하므로 RedFilter만큼 내결함성이 없습니다.
Micah B.

1
HTML은 XML의 하위 집합이 아닙니다. XHTML은 있지만 HTML은 더 이상 그 길로 향하지 않습니다.
David

7

다음은 LazyCoders 추가 및 좋은 오타 수정 및 <STYLE>HTML 내부의 인라인 태그 를 처리하기위한 자체 추가와 함께 RedFilter 답변 (Pinal의 원본)을 통합하는이 함수의 업데이트 된 버전입니다 .

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()무엇입니까?
Patrick Honorez 2016 년

나는 그것에 대해 정말로 생각하지 않았다. 표시된대로 원본을 복사 / 수정했습니다. 교체가 더 나은 옵션 일 수 있습니다. 고려해야 할 두 가지 기능 사이의 성능 비교가 있는지 궁금하다 ...
고너 더그

1
@GonerDoug는 이것에 대해 응원하고, 받아 들여진 의견을 읽고 있었고, 이것은 정말로 업데이트가 필요합니다.
Jono

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  

나는 내에서 유니 코드 문자를 사용하기 때문에 내가 NVARCHAR 대신 VARCHAR의 사용 후 이것은 나를 위해 일한 HTML 태그
샤디 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

나를 위해 작동하지 않았다 SELECT dbo.StripHtml ( '<b> somestuff </ b>'); 정확한 문자열을 반환합니다
ladieu

@ladieu, 이것은 예상됩니다. 대답의 첫 번째 줄을 확인하십시오 ( "이 SQL은 수반되는 속성과 함께 BR, B 및 P를 제외한 모든 태그를 제거합니다").
Peter Herdenborg 2013

이 SQL 함수는 올바르지 않습니다. 수정 된 기능은 아래 답변을 참조하십시오.
futureelite7

@ futureelite7 SO 페이지에서 답변을 찾을 수있는 위치에 대한 참조로 "아래"및 "위"를 사용하는 것은 의미가 없습니다. 왜냐하면 답변 순서는 상단의 탭을 사용하여 변경할 수 있기 때문입니다 (또한 투표는 답변 순서를 변경할 수 있음). 저자 게시 그것의 이름을 사용하여 대답을 지정하십시오
카이 우스 JARD

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

이것은 모든 요소를 ​​반복하고 text () 만 반환합니다.

공백없이 연결되는 요소 사이의 텍스트를 방지하려면 다음을 사용하십시오.

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 데이터를로드 할 때이 작업을 별도의 연습으로 수행합니다. 잘못된 형식의 xml (예 : 일치하지 않는 시작 / 끝 태그, 잘못된 문자)을 찾으면 SQL에서 오류가 발생하기 때문입니다.

검색 구문을 작성하고 HTML을 제거하려는 경우에 적합합니다.

이것은 xml 유형을 반환하므로 적절한 경우 CAST 또는 COVERT를 텍스트로 반환합니다. 이 데이터 유형의 xml 버전은 잘 구성된 XML이 아니므로 쓸모가 없습니다.


xml에서 캐스팅하는 실제 솔루션이 없으면 이것이 기껏해야 부분적인 솔루션이라고 생각합니다.
Dennis Jaheruddin

CAST (@xml as varchar (max)). 또는 CONVERT (xml), @XML). 대부분의 개발자가 그것을 알아낼 것이라고 가정합니다.
Arvin Amir

1
개발자가 캐스트 방법을 알고 있다고 가정하는 것은 확실히 합리적이지만 귀하의 답변을 읽는 사람이 '간단한'캐스트가 수행해야 할 모든 것임을 직접 보지 못할 수도 있음을 명심하십시오. 특히 우리 가 적절한 곳에 캐스팅 할 수 있다고 언급 되었기 때문입니다 . -나는 부정적이지 않고 유용하다고 인식하기 쉬운 답변을 만드는 데 도움이되기를 바랍니다.
Dennis Jaheruddin

그렇다면이 부분의 열 이름은 무엇입니까? 라는 data열 이있는 테이블이 있고 해당 열의 html모든 값을 선택하고 HTML 태그를 제거하고 싶다고 가정 해 보겠습니다. 어떻게 대답을 사용하여이를 달성 할 수 있습니까?
Felix Eve

2

다음은 UDF가 필요하지 않으며 HTML에 닫는 태그와 일치하지 않는 태그가 포함되어 있어도 작동하는 버전입니다.

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

1

Arvin Amir의 답변은 완전한 단선 솔루션에 가깝지만 어디에서나 사용할 수 있습니다. 그는 select 문에 약간의 버그 (줄 끝 누락)가 있으며 가장 일반적인 문자 참조를 처리하고 싶었습니다.

내가 한 일은 다음과 같습니다.

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

Patrick Honorez 코드는 약간의 변경이 필요합니다.

&lt;또는 포함하는 html에 대해 불완전한 결과를 반환합니다.&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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.