问个 mysql 数据替换的正规则。哪位朋友帮我看看下面 mysql 正规则有什么问题? 谢谢

数据库里有一些下面格式的图片:
<p><img alt="文字" title="文字" src="http://pic.baidu.com/image/32778.jpg"></p>

这图片地址里只有http://pic.baidu.com/是不变的其它都是变的

也有一些的图片

<p><img alt="文字" title="文字" src="http://pic.google.com/image/32778.jpg"></p>

现在只想把全部的 带 http://pic.baidu.com 这个网址的图片替换掉,也就是清除了。

在 mysql5.7版本的 数据库里 ,怎么写正规则能完成这个 或者 有什么好的方法吗?

update bodytext set body=replace(body, "<p><img alt=".*" title=".*" src="http://pic.baidu.com.*"></p>", "");

上面是我写的。不成功。

请哪位熟悉 mysql 的朋友帮我看看怎么改? 或者有什么好的办法把 <p><img alt="文字" title="文字" src="http://pic.baidu.com/image/32778.jpg"></p> 这类图片全部替换成空
谢谢。

我的mysql 是5.7版本的

阅读 2.1k
2 个回答

2020-09-15
之前没看明白需求,回答草率了。
更正下我理解的需求:遍历查找body中所有<img>标签,如果来自pic.baidu.com的,直接删除该<img>标签。
正则匹配表达式:<img.*?pic\.baidu\.com.*?>
如果直接在java、php等后台语言中,很容易直接使用正则进行替换,但mysql 5.7的replace不能和正则一起用,因此放弃。

换种思路,如何去取出body中所有img标签且含有pic.baidu.com的字符串?
主要思路:循环查找出所有<img>标签,判断是否为pic.baidu.com,最后再关联主表bodytest进行update。
下面用mysql的substrlocatereplacesubstring_index函数来截取和替换,函数的意思自行百度。

最终UPDATE的SQL如下:

update bodytext m inner join 
 (select t3.id,substr(t3.body,char_length(t3.str)+1,locate('>',t3.body,char_length(t3.str)+1)-char_length(t3.str)) as bdimg 
   from (select t1.id,t1.body,substring_index(t1.body,'<img',t2.help_topic_id+1) str from bodytext t1 inner join mysql.help_topic t2 on (LENGTH(t1.body)-LENGTH(replace(t1.body,'<img','')))/4>t2.help_topic_id)t3
 )n on m.id=n.id and n.bdimg like '%pic.baidu.com%'
set m.body=replace(m.body,n.bdimg,'');

附表结构和测试数据:

CREATE TABLE `bodytext` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `body` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO `bodytext` (`id`, `body`) VALUES ('1', '<p>导读: “我有一个人生建议会让你受益一生哦!”“什么人生建议啊。”<img alt=\"文字\" title=\"文字\" src=\"http://pic.google.com/image/1.jpg\">“这辈子和我在一起。”快来看看励志故事网的小编为你们准备的抖音撩人的土味情话吧!</p><p></p><p>1. 往后日子,万事俱备,只差你而已。<img alt=\"文字\" title=\"文字\" src=\"http://pic.baidu.com/image/2.jpg\"></p>');
INSERT INTO `bodytext` (`id`, `body`) VALUES ('2', '<p><img alt=\"文字\" title=\"文字\" src=\"http://pic.baidu.com/image/32779.jpg\"></p>');
INSERT INTO `bodytext` (`id`, `body`) VALUES ('3', '<p><img alt=\"文字\" title=\"文字\" src=\"http://pic.google.com/image/32778.jpg\"></p>');
INSERT INTO `bodytext` (`id`, `body`) VALUES ('4', '<p>导读: “我有一个人生建议会让你受益一生哦!”</p>');

2020-09-14
直接用like就可以了。。。
update bodytext set body='' where body like '%pic.baidu.com.%'

感觉,直接replace 把你的那个域名替换成空就可以了吧,如果内容中不会有其他地方出现这个域名

用正则也可以,要使用反向引用,把需要保留的内容用括号()包围起来,然后使用反向引用来拼接出你希望的格式。 目前 5.7replace 对于正则支持有限,8.0才提供了 regexp_replace 所以,你可以自己试下。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题