全球主机交流论坛

标题: [已解决]求助个SQL命令(正则) [打印本页]

作者: siyi    时间: 2021-7-5 11:00
标题: [已解决]求助个SQL命令(正则)
本帖最后由 siyi 于 2021-7-5 12:49 编辑

已经顺利解决,感谢18楼 pi9 大佬的指导。已经顺利解决了。
也感谢各位MJJ集思广益,提供了很多的方法。





需求:

由于突发奇想把WordPress自动生成的缩略图片都删除了,只保留原图,现在网站很多文章显示错误。想要通过SQL命令修复一下。

目前文章的图片是:https://example.com/wp-content/uploads/2021/07/73194819431-1920x1080.png,由于缩略图已经删除,所以得改成https://example.com/wp-content/uploads/2021/07/73194819431.png才能访问。
也就是需要删除"-1920x1080", 文件名随机,缩略图尺寸随机,文件名后缀随机。
估计需要用到正则,不过我完全不会。

50元请大佬帮帮忙,经费有限,先到先得。万分感谢!
作者: 唐王李世民    时间: 2021-7-5 11:03
为什么要随机?

这个可能需要遍历,然后删除-1920x1080

sql不懂
作者: airline    时间: 2021-7-5 11:05
你家一包烟50
作者: siyi    时间: 2021-7-5 11:05
唐王李世民 发表于 2021-7-5 11:03
为什么要随机?

这个可能需要遍历,然后删除-1920x1080

表达不清哈,意思就是要删除-1920x1080之类的。因为图片大小不一样,所以产生的缩略图尺寸也是随机的呀。
可能是-1024x768或者-300x200, 不一定。
作者: siyi    时间: 2021-7-5 11:06
airline 发表于 2021-7-5 11:05
你家一包烟50

我不抽烟……
反正看别人抽的烟大概这个价格?
作者: airline    时间: 2021-7-5 11:08
siyi 发表于 2021-7-5 11:06
我不抽烟……
反正看别人抽的烟大概这个价格?

有钱人像我们这种穷人连十块的都抽不起
作者: airline    时间: 2021-7-5 11:09
这边建议php遍历然后替换
截取-到.png之间的字符然后前面拼接上- replace一下就行了
作者: siyi    时间: 2021-7-5 11:27
airline 发表于 2021-7-5 11:09
这边建议php遍历然后替换
截取-到.png之间的字符然后前面拼接上- replace一下就行了 ...

有没有那种能喂到嘴里的那种?
作者: van    时间: 2021-7-5 11:29
你这个url是存在db里面的吗?
作者: liuyangge    时间: 2021-7-5 11:31
不用正则,update + replace函数即可

  1. update 表名 set 字段名 = replace(字段名,"-1920x1080","") where id = 1
复制代码


可以先改下id测试一下看看,没问题把where条件删掉,全部跑一遍就ok了
作者: 落英缤纷    时间: 2021-7-5 11:32
先备份数据库

https://lilynana.eu.org/thread-844936-1-1.html
然后用我这个帖子里的数据库替换,第2个里面留空试试。
作者: siyi    时间: 2021-7-5 11:36
van 发表于 2021-7-5 11:29
你这个url是存在db里面的吗?

是啊,存在mysql里
wp_posts表的post_content字段里。
作者: siyi    时间: 2021-7-5 11:38
liuyangge 发表于 2021-7-5 11:31
不用正则,update + replace函数即可

不行的哦,因为图片大小不是固定的,所以后面不一定是-1920x1080,可能是800x1080,1200x1080,1920x300, 1920x1000 各种可能。
作者: siyi    时间: 2021-7-5 11:40
落英缤纷 发表于 2021-7-5 11:32
先备份数据库

https://lilynana.eu.org/thread-844936-1-1.html

这个不行哦
replace("字符串", "被替换内容","替换内容")
被替换内容怎么填,分辨率随机的呢。
作者: airline    时间: 2021-7-5 11:47
siyi 发表于 2021-7-5 11:27
有没有那种能喂到嘴里的那种?

懒得写
作者: 落英缤纷    时间: 2021-7-5 11:48
siyi 发表于 2021-7-5 11:40
这个不行哦
replace("字符串", "被替换内容","替换内容")
被替换内容怎么填,分辨率随机的呢。 ...

那就替换多次啊  看看有几种分辨率
作者: siyi    时间: 2021-7-5 11:50
落英缤纷 发表于 2021-7-5 11:48
那就替换多次啊  看看有几种分辨率

不是啊,有6万多张图片呢,什么分辨率的都有,不一定是标准尺寸的。
可能是1920 也可能是1919,1918 1921……
作者: pi9    时间: 2021-7-5 11:53
好久没用WP了,随手给你写一个,表名和字段是按照我记忆来的。

update wp_posts set post_content = REGEXP_REPLACE(post_content, '\-[0-9]{3,5}x[0-9]{3,5}', '')  where 1;

执行前先备份一下这张表。
作者: liuyangge    时间: 2021-7-5 12:02
siyi 发表于 2021-7-5 11:38
不行的哦,因为图片大小不是固定的,所以后面不一定是-1920x1080,可能是800x1080,1200x1080,1920x300,  ...

喔 没注意看题,如果尺寸少一些的话 多跑几次就好了,多的话  用其他语言跑一下就好了
作者: siyi    时间: 2021-7-5 12:02
pi9 发表于 2021-7-5 11:53
好久没用WP了,随手给你写一个,表名和字段是按照我记忆来的。

update wp_posts set post_content = REGEX ...

大佬,我的是mysql5.7 不是mysql8,没有regexp_replace怎么办
作者: FreeDog    时间: 2021-7-5 12:04
个人会直接nv cat 导出来 正则替换 导回去
作者: uzerhode    时间: 2021-7-5 12:05
寻找第一个'-',把它及之后全删了,再新字段加个.png
这个要正则么?
作者: pi9    时间: 2021-7-5 12:08
本地装个8 把数据修复了再导回线上。 你这个需求不用我那个函数,修复不了
作者: siyi    时间: 2021-7-5 12:13
pi9 发表于 2021-7-5 12:08
本地装个8 把数据修复了再导回线上。 你这个需求不用我那个函数,修复不了 ...

好的,我试试看能不能用自定义函数。
作者: 本人马保国    时间: 2021-7-5 12:16
帮顶
作者: siyi    时间: 2021-7-5 12:16
uzerhode 发表于 2021-7-5 12:05
寻找第一个'-',把它及之后全删了,再新字段加个.png
这个要正则么?

我有想过,可是有的文件名里面也有"-"
作者: 晴晴晴    时间: 2021-7-5 12:21
本帖最后由 晴晴晴 于 2021-7-5 12:22 编辑

寻找倒数第一个'-',把它及之后全删了,再获取倒找. 取其后面全部

sql正则不太会 自行摸索 没有案例写不出来
作者: xhcj666    时间: 2021-7-5 12:24
不行就全导出来到另外一张表咯,几万行也还好。就可以用你熟悉的语言做正则表达式替换了
作者: 暗贱难防    时间: 2021-7-5 12:34
前缀长度一样吗,一样的话,直接从坐标截取,然后拼上一个后缀就行,这种一次性的工作,怎么简单方便怎么来
作者: 暗贱难防    时间: 2021-7-5 12:35
left(str, length)  CONCAT(string1,string2,...) 这两函数
作者: pi9    时间: 2021-7-5 12:43
上面很多人的解决方案,都认为那个字段只存了 1 个或 n 个 url,没考虑到会有其他文字的情况,这些人的解决方案都是错的,这种情况只能用正则,也就是我这条 SQL:

update wp_posts set post_content = REGEXP_REPLACE(post_content, '\-[0-9]{3,5}x[0-9]{3,5}', '')  where 1;


所以,上面这条 SQL 是最优也是最简单的方案,实现有两个方法:

1、本地装 mysql 8.0,线上数据拉取到本地,执行上面 SQL,数据修复后,线上替换成新数据。
2、参考 https://blog.csdn.net/qq_35861801/article/details/103183360  ,给 mysql 5.7 自定义函数,然后线上直接替换。

至于数据拖出来用 PHP 等脚本来跑,这种方案太繁琐,不至于。




欢迎光临 全球主机交流论坛 (https://lilynana.eu.org/) Powered by Discuz! X3.4