创建内联表函数以去除HTML

时间:2015-10-15 17:19:28

标签: sql sql-server tsql

我试图创建一个内联表函数来去除HTML(这样我就可以用另一个表CROSS APPLY来创建它。我们有一个标量函数,但性能不够好。

我真的很擅长使用T-SQL,所以我不知道它有很多好的做法,所以如果有人有任何建议,请告诉我!

这是我到目前为止所做的:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION StripHTML
(   
    @text VARCHAR(MAX)
)
RETURNS TABLE 
AS
RETURN
    WITH BracketIndexes (startIndex, stopIndex) AS (SELECT
            CHARINDEX('<', @text),
            CHARINDEX('>', @text) UNION ALL SELECT
            CHARINDEX('<', @text, stopIndex + 1),
            CHARINDEX('>', @text, stopIndex + 1)
        FROM BracketIndexes
        WHERE startIndex > 0 AND stopIndex > 0
    )
    SELECT * FROM BracketIndexes

现在我有<>所在的索引,我不知道如何:

  • 删除这些索引之间的内容
  • 返回字符串以便我可以交叉应用

我认为我可以使用LEFT / RIGHT连接每个方括号的左侧和右侧,但我似乎无法使指数正确。< / p>

编辑:

这种方式有用:

DECLARE @text VARCHAR(100) = 'HELLO <B>WORLD</B> asd';

WITH BracketIndexes (startIndex, stopIndex) AS (
    SELECT
        CHARINDEX('<', @text),
        CHARINDEX('>', @text)
    UNION ALL
    SELECT
        CHARINDEX('<', @text, stopIndex + 1) - (stopIndex - startIndex + 1),
        CHARINDEX('>', @text, stopIndex + 1) - (stopIndex - startIndex + 1)
    FROM BracketIndexes
    WHERE startIndex > 0 AND stopIndex > 0
)
SELECT @text = LEFT(@text, startIndex - 1) + RIGHT(@text, LEN(@text) - stopIndex)FROM BracketIndexes WHERE startIndex > 0 AND stopIndex > 0
SELECT @text

但是当我在@text中添加更多HTML语句时,RIGHT的长度参数不正确。

2 个答案:

答案 0 :(得分:3)

你是在正确的道路上。对于CTE的每次递归,您希望使用REPLACE()和SUBSTRING()的组合基本上用空格替换一个HTML元素:

DECLARE @text varchar(max) = '<a href="">Cool!</a><b>oh yeah!</b>'  

;WITH BracketIndexes (rowNumber, original, startIndex, stopIndex, replaced) AS (SELECT
        1,
        @text,
        CHARINDEX('<', @text),
        CHARINDEX('>', @text),
        REPLACE(@text,SUBSTRING(@text,CHARINDEX('<', @text),CHARINDEX('>', @text)),'') UNION ALL SELECT
        rowNumber+1,
        replaced,
        CHARINDEX('<', replaced),
        CHARINDEX('>', replaced),
        REPLACE(replaced,SUBSTRING(replaced,CHARINDEX('<', replaced),CHARINDEX('>', replaced)),'')
    FROM BracketIndexes
    WHERE startIndex > 0 AND stopIndex > 0
)
SELECT TOP 1
    replaced
FROM 
    BracketIndexes
ORDER BY RowNumber DESC

答案 1 :(得分:0)

你可以非常简单地尝试这样的事情。当然没有经过充分测试

declare @str varchar(max)='<table><th>abc</th><tr><td>def</td></tr></table>'
select @str=replace(replace(@str,'<','~<'),'>','>~')
select * from dbo.split('~',@str) where value<>'' and SUBSTRING(value,1,1)<>'<'

仅将其视为逻辑。当然案件可能会失败