文章:blog.csdn.net/ycj1982/art…php
最近作一个项目(项目是采用的第三方的内容php框架+mysql搭建的),项目中有个功能须要采集大量的文章数据,数据库中直接存储的是文章的网址(举例:www.xxx.com/article?id=…mysql
因此网站采集事后须要批量处理文章的url网址更换成现有的域名,须要大批量的更换数据库文章连接,查看了项目原来更新的方式是采起读取文章URL,再后端程序批量替换,这样操做耗时并且会形成程序页面卡死终止运行。正则表达式
想优化这种更新方式,思考着采用sql代码上操做速度应该很快。sql
经过实验mysql中replace 函数是不能直接使用正则表达式替换的。数据库
网络搜索也没找到好的解决办法。经过本身研究采用replace 函数+ REGEXP 函数、再集合其余字符串处理作出来的批量更新url字符串中的网址。后端
解决方案和思路以下:php框架
注释:id , url 是你数据库存储连接的字段名。如下举例都是以https:// 作的。网络
一、先验证域名是哪一种方式(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
二、先排除url中的http:// 或者 https:// 用于后续取值使用
SUBSTRING(url,LENGTH('https://')+1) //返回的url值是不包含http:// 或者 https:// 的字符串
三、搜索定位已经删除(http:// 或者 https://)的字符串中的‘/’
LOCATE('/',SUBSTRING(url,LENGTH('https://')+1
//举例:URL= ‘www.2333.com/a/ba/ba’
//删除https:// 后,URL = ‘www.2333.com/a/ba/ba’
//查找URL 中从左边第一个‘/’ 也就是定位域名后面的斜杠位置。用于后续把“www.2333.com/”这个完整域名取出做为…
四、完整取出 url中的网址(格式:www.2333.com/)。
SUBSTRING(url,1,LOCATE('/',SUBSTRING(url,LENGTH('https://')+1))+ LENGTH('https://') )
五、最后加上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) ,"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) ,"t.w123.com/")
以上是我处理本次项目遇到的问题方案,处理更新效率比以前的后端程序快不少。发布记录下,若是你们有更好的建议方案欢迎留言交流谢谢。