如何用MySQL LIKE检索文本含指定关键词但HTML标签不含该关键词的记录?
正确查询HTML文本中关键词不在标签内的记录
原SQL语句的核心问题是:content NOT LIKE '<%span%>'会错误排除所有包含<...span...>标签的记录——哪怕这些记录同时在标签外也有关键词(比如示例2的情况),这完全违背了需求。我们需要的是只要关键词至少有一次出现在HTML标签之外,就保留该记录,而非排除所有含标签内关键词的记录。
以下是不同数据库的实现方案:
MySQL/MariaDB(不支持正则环视)
由于MySQL的正则不支持正向/反向环视,我们可以通过匹配关键词出现在标签闭合符>之后、标签开始符<之前,或者文本开头的情况来判断:
SELECT * FROM mytable WHERE `content` LIKE '%span%' AND ( `content` REGEXP '>[^<]*span' -- 关键词在标签闭合后 OR `content` REGEXP 'span[^>]*<' -- 关键词在标签开始前 OR `content` REGEXP '^span' -- 关键词在文本开头(无前置标签) );
PostgreSQL(支持正则环视)
利用正则的否定环视功能,可以更精准地匹配不在标签内的关键词:
SELECT * FROM mytable WHERE content ~ 'span' AND content ~ '(?<!<[^>])span(?!>[^<])';
解释:
(?<!<[^>]):反向否定环视,确保"span"前面不是未闭合的标签内容(即不在<到>的区间内)(?!>[^<]):正向否定环视,确保"span"后面不是未闭合的标签内容
SQL Server
使用REGEXP_LIKE函数实现类似逻辑:
SELECT * FROM mytable WHERE content LIKE '%span%' AND REGEXP_LIKE(content, '(^|>)span|<[^>]*>.*span');
补充说明
如果你的数据存在复杂的HTML嵌套(比如标签内包含引号、换行等),纯SQL正则的处理能力有限,这种情况下建议先在应用层将HTML标签剥离后再进行关键词匹配,结果会更准确。
内容的提问来源于stack exchange,提问作者Duddy67
相关产品推荐
相关产品推荐

