msyql 中批量替換url網址中的域名方案。

文章: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/")

以上是我處理本次項目遇到的問題方案,處理更新效率比以前的後端程序快不少。發佈記錄下,若是你們有更好的建議方案歡迎留言交流謝謝。

相關文章
相關標籤/搜索