如何在MySQL数据库中检索加粗内容匹配'axy'的行?
MySQL检索加粗文本组合匹配指定内容的行
需求:从字段包含HTML <strong>标签的数据表中,筛选出所有<strong>包裹的文本拼接后等于axy的行。
方法一:MySQL 8.0+ 原生正则函数实现
利用REGEXP_REPLACE函数先提取所有<strong>标签内的内容,拼接后进行匹配:
SELECT * FROM your_table WHERE REGEXP_REPLACE( -- 仅保留所有<strong>...</strong>片段 REGEXP_REPLACE(content, '.*?(<strong>.*?</strong>)|.*', '$1', 1, 0, 's'), -- 移除所有<strong>和</strong>标签 '<\/?strong>', '' ) = 'axy';
语句说明
- 内层
REGEXP_REPLACE:遍历字段内容,只保留所有<strong>标签包裹的片段,其余内容全部清除。's'参数让.可以匹配换行符(适配字段包含换行的场景)。 - 外层
REGEXP_REPLACE:移除残留的<strong>和</strong>标签,得到所有加粗文本的拼接结果。 - 最后判断拼接结果是否等于
axy,筛选符合条件的行。
方法二:适配MySQL 5.x版本(自定义函数)
如果你的MySQL版本低于8.0,没有正则替换函数,可以自定义一个函数来提取并拼接加粗文本:
DELIMITER // CREATE FUNCTION extract_bold_text(input TEXT) RETURNS TEXT DETERMINISTIC BEGIN DECLARE result TEXT DEFAULT ''; DECLARE start_pos INT; DECLARE end_pos INT; DECLARE bold_text TEXT; SET start_pos = LOCATE('<strong>', input); WHILE start_pos > 0 DO SET end_pos = LOCATE('</strong>', input, start_pos + 8); IF end_pos > 0 THEN -- 提取<strong>和</strong>之间的文本 SET bold_text = SUBSTRING(input, start_pos + 8, end_pos - start_pos - 8); SET result = CONCAT(result, bold_text); -- 截取剩余未处理的内容 SET input = SUBSTRING(input, end_pos + 9); ELSE SET start_pos = 0; END IF; SET start_pos = LOCATE('<strong>', input); END WHILE; RETURN result; END // DELIMITER ;
创建函数后,直接调用函数查询:
SELECT * FROM your_table WHERE extract_bold_text(content) = 'axy';
函数说明
循环查找字段中的<strong>标签,提取每个标签内的文本并拼接,直到处理完所有标签,最终返回拼接后的加粗文本,再与目标内容匹配。
内容的提问来源于stack exchange,提问作者H.R Sh
相关产品推荐
相关产品推荐

