0

私はこの機能を持っています:

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

<em>タグとタグを除くすべてを削除する必要があり<strong>ます。

ありがとうございました

トーマス

4

3 に答える 3

1

clr 関数による xslt 変換 (例: MDS アセンブリからのもの)

アップデート

XSLT 変換アプローチを使用した答えは次のとおりです。Nokogiri を使用して一部を除くすべてのタグを削除する方法

更新 2

残っている唯一のオプションは、正規表現を使用することです。ここでも CLR 関数を使用します。

リンク以外のすべての HTML タグを取り除く

MDS アセンブリのインストール

MDS を使用せずに SQL 2008 R2 MDS 関数を展開する

于 2012-04-19T19:58:59.980 に答える
0

次のような SQL 関数を使用できます。

ALTER FUNCTION [dbo].[StripOutHTML]
(
    @HTMLText VARCHAR(max),
    @stripDisallowedOnly BIT
)
returns VARCHAR(max) 
AS 
  BEGIN 
      DECLARE @Start INT
      DECLARE @End INT
      DECLARE @Length INT 

      -- Replace the HTML entity & with the '&' character (this needs to be done first, as  
      -- '&' might be double encoded as '&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 < 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 > 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 & 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   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 <P>, </P>tags with a <BR>, so they will be replaced with a new line in next step  
      SET @HTMLText = REPLACE(@HTMLText, '<P>', '<br>') 
      SET @HTMLText = REPLACE(@HTMLText, '</P>', '<br>') 

      -- 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  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  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  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 
            IF @stripDisallowedOnly = 1 
              BEGIN 
                  IF ( Upper(Substring(@HTMLText, @Start, 2)) <> '<B' ) 
                     AND ( Upper(Substring(@HTMLText, @Start, 3)) <> '</B' ) 
                     AND ( Upper(Substring(@HTMLText, @Start, 2)) <> '<U' ) 
                     AND ( Upper(Substring(@HTMLText, @Start, 3)) <> '</U' ) 
                     AND ( Upper(Substring(@HTMLText, @Start, 2)) <> '<I' ) 
                     AND ( Upper(Substring(@HTMLText, @Start, 3)) <> '</I' ) 
                    BEGIN 
                        SET @HTMLText = Stuff(@HTMLText, @Start, @Length, '') 
                    END 
                  ELSE 
                    BEGIN 
                        SET @Length = 0 
                    END 
              END 
            ELSE 
              BEGIN 
                  SET @HTMLText = Stuff(@HTMLText, @Start, @Length, '') 
              END 

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

      -- Remove any leading space/carriage return 
      DECLARE @trimchars VARCHAR(10)
      SET @trimchars = CHAR(9)+CHAR(10)+CHAR(13)+CHAR(32)
         IF @HTMLText LIKE '[' + @trimchars + ']%' SET @HTMLText = SUBSTRING(@HTMLText, PATINDEX('%[^' + @trimchars + ']%', @HTMLText), LEN(@HTMLText))
      RETURN Ltrim(Rtrim(@HTMLText)) 
  END

次のようなタグを保持するために、次の行を変更する必要がありますem: ( Upper(Substring(@HTMLText, @Start, 2)) <> '<B' ): SQL関数は<BR>and<P>タグを新しい行に置き換えますが、必要がない場合はこれらの行を簡単に削除できます。正しい方向に。

WHILE ( @Start > 0 
      AND @End > 0 
      AND @Length > 0 ) 
BEGIN 
    IF @stripDisallowedOnly = 1 
      BEGIN 
          IF ( Upper(Substring(@HTMLText, @Start, 2)) <> '<B' ) 
             AND ( Upper(Substring(@HTMLText, @Start, 3)) <> '</B' ) 
             AND ( Upper(Substring(@HTMLText, @Start, 2)) <> '<U' ) 
             AND ( Upper(Substring(@HTMLText, @Start, 3)) <> '</U' ) 
             AND ( Upper(Substring(@HTMLText, @Start, 2)) <> '<I' ) 
             AND ( Upper(Substring(@HTMLText, @Start, 3)) <> '</I' ) 
            BEGIN 
                SET @HTMLText = Stuff(@HTMLText, @Start, @Length, '') 
            END 
          ELSE 
            BEGIN 
                SET @Length = 0 
            END 
      END 
    ELSE 
      BEGIN 
          SET @HTMLText = Stuff(@HTMLText, @Start, @Length, '') 
      END 

    SET @Start = Charindex('<', @HTMLText, @End - @Length) 
    SET @End = Charindex('>', @HTMLText, Charindex('<', @HTMLText, 
                                         @Start) 
               ) 
    SET @Length = ( @End - @Start ) + 1 
END 
于 2014-06-30T16:54:25.727 に答える
0

編集: 以下は、HTML が非常に具体的であるため、問題に使用したものです。元の質問に対する正しい答えは、上記で Denis が受け入れたものです。

私が使用しているデータは非常に具体的です。

削除する必要があるタグはすべて大文字です。つまり:

私が保持したいものは小文字です。

したがって、CHARINDEX の代わりに PATINDEX を使用すると、これを簡単に行うことができました。

ALTER FUNCTION [dbo].[udf_StripHTMLlinks]
(@HTMLText VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @Start INT
DECLARE @End INT
DECLARE @Length INT
SET @Start = PATINDEX('%<[/ABCDEFGHIJKLMNOPQRSTUVWXYZ][/ABCDEFGHIJKLMNOPQRSTUVWXYZ    >]%',@HTMLText COLLATE SQL_Latin1_General_CP1_CS_AS)
SET @End = CHARINDEX('>',@HTMLText,PATINDEX('%<[/ABCDEFGHIJKLMNOPQRSTUVWXYZ][/ABCDEFGHIJKLMNOPQRSTUVWXYZ >]%',@HTMLText COLLATE SQL_Latin1_General_CP1_CS_AS))
SET @Length = (@End - @Start) + 1
WHILE @Start > 0
AND @End > 0
AND @Length > 0
BEGIN
SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'')
SET @Start = PATINDEX('%<[/ABCDEFGHIJKLMNOPQRSTUVWXYZ][/ABCDEFGHIJKLMNOPQRSTUVWXYZ >]%',@HTMLText COLLATE SQL_Latin1_General_CP1_CS_AS)
SET @End = CHARINDEX('>',@HTMLText,PATINDEX('%<[/ABCDEFGHIJKLMNOPQRSTUVWXYZ][/ABCDEFGHIJKLMNOPQRSTUVWXYZ >]%',@HTMLText COLLATE SQL_Latin1_General_CP1_CS_AS))
SET @Length = (@End - @Start) + 1
END
RETURN LTRIM(RTRIM(@HTMLText))
END

入力していただきありがとうございます。

于 2012-04-19T20:29:25.447 に答える