msyql 中批量替换url网址中的域名方案。

2 篇文章 0 订阅

最近做一个项目(项目是采用的第三方的内容php框架+mysql搭建的),项目中有个功能需要采集大量的文章数据,数据库中直接存储的是文章的网址(举例:http://www.xxx.com/article?id=111)。

所以网站采集过后需要批量处理文章的url网址更换成现有的域名,需要大批量的更换数据库文章链接,查看了项目原来更新的方式是采取读取文章URL,再后端程序批量替换,这样操作耗时而且会造成程序页面卡死终止运行。

想优化这种更新方式,思考着采用sql代码上操作速度应该很快。

通过实验mysql中replace 函数是不能直接使用正则表达式替换的。

网络搜索也没找到好的解决办法。通过自己研究采用replace 函数+ REGEXP 函数、再集合其他字符串处理做出来的批量更新url字符串中的网址。

解决方案和思路如下:

注释:id , url 是你数据库存储链接的字段名。以下举例都是以https:// 做的。

1、先验证域名是哪种方式(http 或者https)

a、如果url是以http或者https开头的则进入下一个验证:再次验证区分具体是HTTP 或者https 。

b、如果url不是以http或者https开通的则直接返回URL。

select if(url REGEXP '^(https:\/\/)|(http:\/\/)',if(url REGEXP '^(https:\/\/)','','0'), url ) ,id,url from table_name

2、先排除url中的http:// 或者 https://  用于后续取值使用

SUBSTRING(url,LENGTH('https://')+1)  //返回的url值是不包含http:// 或者 https:// 的字符串

3、搜索定位已经删除(http:// 或者 https://)的字符串中的‘/’

LOCATE('/',SUBSTRING(url,LENGTH('https://')+1       

//举例:URL= ‘https://www.2333.com/a/ba/ba’

//删除https:// 后,URL = ‘www.2333.com/a/ba/ba’ 

//查找URL 中从左边第一个‘/’ 也就是定位域名后面的斜杠位置。用于后续把“https://www.2333.com/”这个完整域名取出作为替换的字符串。

4、完整取出 url中的网址(格式:https://www.2333.com/)。

SUBSTRING(url,1,LOCATE('/',SUBSTRING(url,LENGTH('https://')+1))+ LENGTH('https://') )

 

5、最后加上if 判断当前url 具体是哪种格式的网址,然后再采用对应的截取方式取出带替换掉的域名。(方便阅读代码做了换行)

REPLACE(url,
if(url REGEXP '^(https:\/\/)|(http:\/\/)',if(url REGEXP '^(https:\/\/)',  
SUBSTRING(url,1,LOCATE('/',SUBSTRING(url,LENGTH('https://')+1))+ LENGTH('https://') )
,SUBSTRING(url,1,LOCATE('/',SUBSTRING(url,LENGTH('http://')+1))+ LENGTH('http://') )
),url)
,"http://t.w123.com/")

这是拿来修改的表中所有数据的sql代码:


update  table_name  set url = REPLACE(url,
if(url REGEXP '^(https:\/\/)|(http:\/\/)',if(url REGEXP '^(https:\/\/)',  
SUBSTRING(url,1,LOCATE('/',SUBSTRING(url,LENGTH('https://')+1))+ LENGTH('https://') )
,SUBSTRING(url,1,LOCATE('/',SUBSTRING(url,LENGTH('http://')+1))+ LENGTH('http://') )
),url)
,"http://t.w123.com/")

 

以上是我处理本次项目遇到的问题方案,处理更新效率比之前的后端程序快很多。发布记录下,如果大家有更好的建议方案欢迎留言交流谢谢。

 

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值