【问题标题】:Find all rows in Sql Server table containing HTML tags查找包含 HTML 标记的 Sql Server 表中的所有行
【发布时间】:2014-06-03 15:42:53
【问题描述】:

假设我有下表:

CREATE TABLE test (
    head NVARCHAR(100),
    body NTEXT
)   

在这个表中,我想找到 body 列包含 HTML 标记的所有行。任何 HTML 标记,但解决方案不应遗漏任何内容。换句话说,更多的假阳性比更多的假阴性更好。

谁能帮我想出一个可行的解决方案?如果这是代码,我会使用 HTML 解析器或正则表达式来代替。但是我在 SQL Server 中没有开箱即用的正则表达式功能(理想情况下,这将与 2005 及更高版本兼容,但与 2008 及更高版本兼容也可以)。

任何帮助将不胜感激。

另外,上面是NTEXT。如果上表的BODY 列的类型是NVARCHAR(MAX),您的答案会改变吗?

谢谢!

【问题讨论】:

  • 为什么不直接搜索/>?这是一组非常独特的 HTML 字符,而且速度会很快。
  • 那么为什么不直接select ... where body like '%<%'?由于误报是可以的,因此您是否找到具有a < b 的记录并不重要,v.s. <html>
  • 你说的很对,这就是我倾向于的解决方案。只是想知道是否有人想出了更优雅的东西
  • 使用NVARCHAR(MAX) 而不是已弃用的NTEXT 将允许您在该列上使用所有常规字符串函数。处理NTEXT 列不太舒服....
  • 我听到了@marc_s 这就是我特别提到数据类型的原因。不幸的是,我可能要处理很多遗留表,有些是 NVARCHAR,有些是 NTEXT

标签: html sql sql-server


【解决方案1】:

我同意 cmets 的问题,即使用简单的 LIKE '%<%' 就足够了。 SQL Server 确实使用PATINDEX 函数进行了类似正则表达式的处理。 This answer 有几个例子,还有the MSDN link about it

PATINDEX 返回一个索引,其中 0 是一个有效索引(请注意)

【讨论】:

    【解决方案2】:

    由于我对没有那么多误报感兴趣,所以我更进一步。根据html 5 standard on start tags,您以“

    所以这里是 '

    like '%<[A-Za-z0-9]%'
    

    如果您想深入查看两个字符,第二个字符也可以是“/”、“>”或空格。特殊字符会导致问题,所以我相信你必须声明一个变量才能让它们发生:

    declare @html_pattern varchar(50)
    set @html_pattern = '%<[A-Za-z0-9][A-Za-z0-9/> ' + 
        char(9) + char(10) + char(11) + char(13) + ']%'
    
    like @html_pattern
    

    关于一个稍微不同但相关的想法,您可能还应该寻找 html cmets:

    like '%<!--'
    

    说了这么多,我承认我从来没有真正看到过以数字开头的 html 标签,所以我实际上是在使用:

    declare @html_pattern varchar(50)
    set @html_pattern = '%<[A-Za-z][A-Za-z0-9/> ' + 
        char(9) + char(10) + char(11) + char(13) + ']%'
    

    如果没有人在我身上跳来跳去,我无法在这里正式推荐它。另外,为了记录,更简单的

    like '%<[A-Za-z]%'
    

    对于我的数据集也同样有效(诚然,它并没有那么大,唯一的误报是 >[0-9] 的形式)。我认为你甚至可以逃脱:

    like '%<[a-z]%'
    

    因为几乎没有人用大写字母编写标签名称(注意我说的是“几乎”),特别是如果您的数据确实有大写字母的误报,但我宁愿不冒险。

    顺便说一句,XML 将有不同的模式。

    这就是我想在没有正则表达式的情况下达到的程度。

    【讨论】:

      【解决方案3】:
      select...where Body like '%<%' and Body like '%>%'
      

      【讨论】:

      • 拥有它不是更简单吗Body like '%&lt;%&gt;%'
      猜你喜欢
      • 2016-12-26
      • 1970-01-01
      • 2011-06-18
      • 2013-04-08
      • 2019-05-24
      • 2017-01-24
      • 2014-06-27
      • 1970-01-01
      • 2011-04-17
      相关资源
      最近更新 更多