我想使用 sqlserver 函数从下面的 HTML 内容中删除标签
select dbo.udf_StripStyle(dbo.udf_StripHTML('<html><head><style type="text/css">.c0 { margin: 0px 0px 10px } </style></head><body><p class="c0">Hi,</p><p class="c0">​</p><p class="c0">Test the email details </p><p class="c0">​</p></body></html>'))
为此,我创建了 2 个函数udf_StripStyle删除样式
ALTER FUNCTION [dbo].[udf_StripStyle] (@HTMLText VARCHAR(4000))
RETURNS VARCHAR(4000) AS
BEGIN
DECLARE @Start INT
DECLARE @End INT
DECLARE @Length INT
SET @Start = CHARINDEX('.c0 {',@HTMLText)
SET @End = CHARINDEX('}',@HTMLText,CHARINDEX('.c0 {',@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('.c0 {',@HTMLText)
SET @End = CHARINDEX('}',@HTMLText,CHARINDEX('.c0 {',@HTMLText))
SET @Length = (@End - @Start) + 1
END
RETURN LTRIM(RTRIM(@HTMLText))
END
另一个功能udf_StripHTML删除 HTML 标记
ALTER FUNCTION [dbo].[udf_StripHTML] (@HTMLText VARCHAR(4000))
RETURNS VARCHAR(4000) 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
当我运行它时,我得到的结果是Hi,​Test the email details ​
和​ 值没有被删除。
但预期的结果是Hi, Test the email details
任何人都可以建议如何删除​ 并仅显示所需的结果。
您在这里面临的问题是解码HTML实体的问题。
TSQL 不提供任何本机执行此操作的内容。但是一个快速的谷歌搜索向我灌输了这个SO响应,其中包含一个应该对您有所帮助的udf
。
或者,如果可以将数据带到 SQL Server 之外,则可以运行一个简单的 powershell 命令来(直接)删除标记并解码实体:
$clean = [System.Web.HttpUtility]::HtmlDecode($htmlString -replace '<[^>]+>','')
其中$htmlString是来自 SQL Server 的数据。