假设我有下表:
CREATE TABLE test (
head NVARCHAR(100),
body NTEXT
)
在此表中,我想查找body列包含HTML标记的所有行。任何HTML标签,但解决方案不应该错过任何东西。换句话说,更多的误报比更多的假阴性更好。
有人能帮我提出可行的解决方案吗?如果这是代码,我会使用HTML解析器或正则表达式代替它。但是,我没有开箱即用的SQL Server中的正则表达式功能(理想情况下,这将与2005年开始兼容,但与2008年以后的兼容性也可以。)
非常感谢任何帮助。
此外,以上是NTEXT
。如果上表BODY
列的类型为NVARCHAR(MAX)
,您的答案是否会改变?
谢谢!
答案 0 :(得分:1)
我同意对该问题的评论,即使用简单的LIKE '%<%'
就足够了。 SQL Server使用PATINDEX
函数进行类似regex的处理。 This answer有一些示例,以及the MSDN link about it。
PATINDEX
返回一个索引,0表示有效索引(只是要注意)
答案 1 :(得分:0)
select...where Body like '%<%' and Body like '%>%'
答案 2 :(得分:0)
由于我对没有那么多误报感兴趣,所以我更进一步。根据{{3}},您以'&lt;'开头,但在此之后,您只能为标记名称添加字母数字。由于我们没有任何方式可以说“一个或多个”,我们必须在“&lt;”之后解决第一个或第二个字符,但这至少可以帮助结果的质量。
所以这里是'&lt;'之后的一个字符,确保下一个字符是字母数字(有趣的是,我在规范中找不到任何禁止以数字开头的字符):
like '%<[A-Za-z0-9]%'
如果你想深入看两个字符,第二个字符也可以是'/','&gt;'或空格。特殊字符会导致问题,因此您必须声明一个变量,以便让它们发生:
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评论:
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]%'
同样适用于我的数据集(诚然,这并不是那么大,唯一的误报是&gt; [0-9])。我想你甚至可以逃脱:
like '%<[a-z]%'
因为几乎没有人用大写字母写标签名称(注意我说“几乎”),特别是如果你的数据确实有大写字母的误报,但我宁愿不抓住这个机会。
作为旁注,XML将具有不同的模式。
就我没有正则表达式而言,这就是我想要的。