如何在MariaDB中检索嵌套在<table>标签内部的<p>标签
问题原因
你之前使用的查询语句存在两处明显错误:
LIKE语法仅支持%(匹配任意长度任意字符)、_(匹配单个任意字符)作为通配符,你用到的*会被识别为普通字符匹配,无法得到预期结果- 即使将
*替换为%,普通LIKE查询也无法限制<p>必须出现在<table>和</table>之间,会出现大量误命中的情况
可行解决方案
方案1:正则匹配(适用MariaDB 10.0.5及以上版本)
MariaDB 10.0.5开始支持PCRE正则,可以用负向预查实现精准匹配,查询语句如下:
SELECT * FROM 你的表名 WHERE content REGEXP '<table[^>]*>([^<]|<(?!/table>))*<p[^>]*>';
该写法兼容带自定义属性的table、p标签,同时避免了贪婪匹配导致p标签出现在table外的误判问题。
如果你的MariaDB版本低于10.0.5不支持正则预查,可以用LIKE配合字符串截取实现:
SELECT * FROM 你的表名 WHERE content LIKE '%<table>%<p>%</table>%' AND SUBSTRING_INDEX(content, '</table>', 1) LIKE '%<table>%<p>%';
方案2:业务代码解析(100%准确率)
如果你的业务场景存在table嵌套、HTML标签不规范等复杂情况,正则查询可能出现边缘场景误判,建议直接将content字段的HTML内容取出,在业务代码中用HTML解析库(如Python BeautifulSoup、Java Jsoup)解析DOM结构,直接查找table标签内部的p节点即可。
内容的提问来源于stack exchange,提问作者Tushar Korat
相关产品推荐
相关产品推荐

