SQL - 删除字符串中的所有 HTML 标记

新手上路,请多包涵

在我的数据集中,我有一个存储用 HTML 标记的文本的字段。一般格式如下:

<html><head></head><body><p>My text.</p></body></html>

我可以尝试通过执行以下操作来解决问题:

 REPLACE(REPLACE(Table.HtmlData, '<html><head></head><body><p>', ''), '</p></body></html>')

然而,这并不是一个严格的规则,因为 一些条目违反了 W3C 标准,并且不包括 <head> 例如标签。更糟糕的是, 可能缺少结束标签。所以我需要为每个可能存在的开始和结束标签包含 REPLACE 函数。

 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    Table.HtmlData,
    '<html>', ''),
    '</html>', ''),
    '<head>', ''),
    '</head>', ''),
    '<body>', ''),
    '</body>', ''),
    '<p>', ''),
    '</p>', '')

我想知道是否有比使用多个嵌套的 REPLACE 函数更好的方法来实现这一点。不幸的是,我在这个环境中唯一可用的语言是 SQL 和 Visual Basic(不是 .NET)。

原文由 dkmann 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答
DECLARE @x XML = '<html><head></head><body><p>My text.</p></body></html>'

SELECT t.c.value('.', 'NVARCHAR(MAX)')
FROM @x.nodes('*') t(c)

更新 - 对于带有未闭合标签的字符串:

 DECLARE @x NVARCHAR(MAX) = '<html><head></head><body><p>My text.<br>More text.</p></body></html>'

SELECT x.value('.', 'NVARCHAR(MAX)')
FROM (
    SELECT x = CAST(REPLACE(REPLACE(@x, '>', '/>'), '</', '<') AS XML)
) r

原文由 Devart 发布,翻译遵循 CC BY-SA 3.0 许可协议

SQL Server 2017+

如果你有一个字符串拆分器功能,你可以从几乎任何文本(格式良好与否)中去除 HTML 标签:

 select string_agg(c.String, null) within group (order by o.Ordinal)
from dbo.SplitString(@Input, N'<') o
    cross apply dbo.SplitString(o.String, N'>') c
where o.Ordinal = 1
    or c.Ordinal = 2;

这将与您的拆分器功能一样高效。因此,它通常应该胜过任何基于循环的解决方案。

基于替换的解决方案无法处理具有属性的注释或元素,这使得它们对我来说实际上毫无用处。

这是我的拆分和剥离功能版本:

 create or alter function dbo.SplitString (
      @String nvarchar(max)
    , @Delimiter nvarchar(4000)
)
returns table with schemabinding
as
    return
    select [key] + 1 as Ordinal, value as String
    from openjson(replace(json_modify(N'[]', N'append $', @String), string_escape(@Delimiter, N'json'), N'","'))

create or alter function dbo.StripHtml (
      @Input nvarchar(max)
)
returns nvarchar(max)
as
begin
    return (
        select string_agg(c.String, null) within group (order by o.Ordinal)
        from dbo.SplitString(@Input, N'<') o
            cross apply dbo.SplitString(o.String, N'>') c
        where o.Ordinal = 1
            or c.Ordinal = 2
    )
end

原文由 Tim Lehner 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题