有没有小伙伴遇到过这样的需求:通过后台管理系统输入某种富文本内容,并在前台显示出来。但是后台管理系统中又要求你不能显示出来这些html标签呢?


文章目录

  • 1. 简单查询
  • 2. 通过 regexp_replace 函数去掉html标签
  • 3. 优化sql,去掉残留的“/n”
  • 4. 如果使用到Mybatis的xml中请注意
  • 5. 一些知识点总结
  • 6. 2021-12-20 补充



小名上面叙述得可能不太清晰,大家可以先看一下从数据库查出来的结果:

富文本mysql字段 sql怎么把富文本标签去掉_java


请注意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

通过这种方式查询的结果:

富文本mysql字段 sql怎么把富文本标签去掉_html_02


可以看出并非我们想要的结果。

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

通过这种方式查询的结果:

富文本mysql字段 sql怎么把富文本标签去掉_html_03


请注意message这个字段中的内容,是呈现了小名希望的结果!!!


可此时,前端的小伙伴跑来找小名,说我为什么不能送佛送到西,将内容处理干净返给他们,这就搞得小名一头雾水,大家也看到了上面的结果,简直完美~

富文本mysql字段 sql怎么把富文本标签去掉_sql_04


既然人家这么说了,小名还是自测一下。果然,postman中显示的结果,确实不尽如人意


postman中的结果如下:

富文本mysql字段 sql怎么把富文本标签去掉_数据库_05


没错,返回的结果中,竟然还有/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

通过这种方式查询的结果:

富文本mysql字段 sql怎么把富文本标签去掉_数据库_06


postman中的结果如下:

富文本mysql字段 sql怎么把富文本标签去掉_富文本mysql字段_07


如若不理解去掉/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中的一些常用转义字符:

显示结果

描述

转义字符

空格

&nbsp;

<

小于号

&lt;

>

大于号

&gt;

&

与号

&amp;

"

双引号

&amp;


单引号

&amp;

6. 2021-12-20 补充

细心的测试小伙伴,查出来一个问题,如下图:

富文本mysql字段 sql怎么把富文本标签去掉_java_08


在返回值中,可能存在&nbsp;&times;这类“&**;”的转义字符,期望是去掉。根据上面的经验其实很简单,不过就是将上面的sql这里修改下

regexp_replace ( regexp_replace ( regexp_replace ( message, '<.+?>', '' ),'&+.+;',''), CHAR ( 10 ), '' ) message,

但是小名又在xml中遇到一个问题:

富文本mysql字段 sql怎么把富文本标签去掉_富文本mysql字段_09


这里呢,我们需要将&+.+; 转义为 &amp;+.+;

富文本mysql字段 sql怎么把富文本标签去掉_sql_10


即可~


富文本mysql字段 sql怎么把富文本标签去掉_富文本mysql字段_11