有没有小伙伴遇到过这样的需求:通过后台管理系统输入某种富文本内容,并在前台显示出来。但是后台管理系统中又要求你不能显示出来这些html标签呢?
文章目录
- 1. 简单查询
- 2. 通过 regexp_replace 函数去掉html标签
- 3. 优化sql,去掉残留的“/n”
- 4. 如果使用到Mybatis的xml中请注意
- 5. 一些知识点总结
- 6. 2021-12-20 补充
小名上面叙述得可能不太清晰,大家可以先看一下从数据库查出来的结果:
请注意en_message这个字段中的内容,是前端在后台管理系统中上传的富文本,用来在前台中显示的一些内容。
但是现在的需求是:在后台管理系统中将这些html标签去掉,只返回纯文本,此时小名查表是通过sql语句写的。
1. 简单查询
SELECT
id,
title,
en_title,
message,
en_message,
sort,
is_deleted,
create_time,
update_time
FROM
sa_introduce
WHERE
is_deleted = 0
通过这种方式查询的结果:
可以看出并非我们想要的结果。
2. 通过 regexp_replace 函数去掉html标签
SELECT
id,
title,
en_title,
regexp_replace ( message, '<.+?>', '') message,
en_message,
sort,
is_deleted,
create_time,
update_time
FROM
sa_introduce
WHERE
is_deleted = 0
通过这种方式查询的结果:
请注意message这个字段中的内容,是呈现了小名希望的结果!!!
可此时,前端的小伙伴跑来找小名,说我为什么不能送佛送到西,将内容处理干净返给他们,这就搞得小名一头雾水,大家也看到了上面的结果,简直完美~
既然人家这么说了,小名还是自测一下。果然,postman中显示的结果,确实不尽如人意
postman中的结果如下:
没错,返回的结果中,竟然还有/n
!!!难怪人家特地过来找小名~
3. 优化sql,去掉残留的“/n”
SELECT
id,
title,
en_title,
regexp_replace ( regexp_replace ( message, '<.+?>', ''),CHAR(10) , '' ) message,
en_message,
sort,
is_deleted,
create_time,
update_time
FROM
sa_introduce
WHERE
is_deleted = 0
通过这种方式查询的结果:
postman中的结果如下:
如若不理解去掉/n
要用到CHAR(10)
,小名归纳到了下文第五点的总结中了。
这次,大家就可以看出,不论是sql中的html标签,又或者是postman中的/n
都被我们去掉了~大功告成!
4. 如果使用到Mybatis的xml中请注意
将 <.+?> 转义为 <.+? ">>
在xml中:
<select id="getIntroduce" resultType="***.entity.pojo.SaIntroduce">
SELECT
id,
title,
en_title,
regexp_replace ( regexp_replace ( message, '<.+?">>', ''),CHAR(10) , '' ) message,
en_message,
sort,
is_deleted,
create_time,
update_time
FROM sa_introduce
where is_deleted = 0
</select>
5. 一些知识点总结
1)正则替换函数:regexp_replace()
只有mysql8.0以上才可以使用
regexp_replace(指定的字符串 , 被替换的字符串 , 用于替换的字符串)
例如:
regexp_replace ( message, ‘<.+?>’, ‘’)
2)char(9), char(10), char(13)分别是:
char(9) 表示水平制表符 (tab键 \t)
char(10) 表示换行键 (\n)
char(13) 表示回车键 (\r)
3)xml中的一些常用转义字符:
显示结果 | 描述 | 转义字符 |
空格 | | |
< | 小于号 | < |
> | 大于号 | > |
& | 与号 | & |
" | 双引号 | & |
’ | 单引号 | & |
6. 2021-12-20 补充
细心的测试小伙伴,查出来一个问题,如下图:
在返回值中,可能存在
和×
这类“&**;”的转义字符,期望是去掉。根据上面的经验其实很简单,不过就是将上面的sql这里修改下
regexp_replace ( regexp_replace ( regexp_replace ( message, '<.+?>', '' ),'&+.+;',''), CHAR ( 10 ), '' ) message,
但是小名又在xml中遇到一个问题:
这里呢,我们需要将&+.+;
转义为 &+.+;
即可~