原來寫在<a href="http://www.cnblogs.com/firstForEver/">博客園的博客</a>,搬家了~ 新博客地址:http://www.hansongda.club/php
前幾天花了三頭二百買了一年的服務器資源,正好前段時間研究研究Laravel框架,就搭建了一個博客系統。<br>html
服務|版本
---|---
Linux|CentOS 7.1
nginx|1.8
mysql|5.6
php|7.1
redis|4.0
Laravel|5.4mysql
遷移過程:<br/>nginx
一開始很頭疼原來的博客文章,怎麼導過來...
想主意怎麼爬取下來,後來意外驚喜的發現博客園右上角有個備份按鈕,立刻點擊一下試試。蕩下來是個XML文件,CDATA部分都是以html存在的文章內容。
<br>
妥了!解析XML就okay了..
<br>展示PHP最好的語言了,直接處理xml的函數redis
```
simplexml_load_file()sql
```shell
尷尬的發現這個函數,默認不能解析出來CDATA部分數據...沒查手冊,立刻想到是用正則解析出來這部分數據:json
備份下的xml文章內容的格式以下:數組
```服務器
<description><![CDATA[<p> Laravel框架中間件使用</p> ]]></description>
<description><![CDATA[<p> 浮點數乘積之後取整,獲得的數不符預期</p>]]></description>
```
若是用正則匹配CDATA區的數據,須要用到<b>零寬向前/後匹配</b>和<b>非貪婪</b>兩個知識點。
```
# 左匹配 <description><![CDATA[
# 右匹配 ]]></description>
# 文章內容利用 [\s\S]*?,問號? 非貪婪模式匹配
preg_match_all('/(?<=<description><\!\[CDATA\[)([\s\S]*?)(?=\]\]><\/description>)/', $xml, $match);
```
正則寫完了之後,發現這樣子導入仍是不如xml一下解析出來來的快..<br/>
網上查了下simplexml的函數,其實第三個可選參數是能夠指定解析CDATA部分的...^_^ 完美
<br>導入的php主要代碼以下:
```
// 博客園備份下來的xml
$filename = 'blogbackup.xml';
// 指定第三個可選參數,解析CDATA
$xml = simplexml_load_file($filename, null, LIBXML_NOCDATA);
// $xml對象,解析成數組格式 巧妙 encode->decode
$xml = json_decode(json_encode($xml), true);
// 倒轉一下:按照原博客的發表順序,導入到新博客
$content = array_reverse($xml['channel']['item']);
// 導入
foreach($content as $con){
// 博客發表時間保持不變
// (date('Y-m-d H:i:s', strtotime($con['pubDate'])+8*3600));
// 入庫操做...
}
```
<br>
導入OK之後,一切看起來都是完美的...直到發現有篇帶圖片的文章,展現不出來...尷尬
原來圖片地址仍是博客園存儲的地址,人家爲了<b>防盜鏈</b>,固然展現不出來了,http code都是403了。
<br>
問題都來了,怎麼解決咧?<br/>
把這些圖片下載到本身的服務器上,圖片名稱保持不變,而後文章內容裏的 img.src 更換下path地址。<br>
<b>正則</b>又來了,開始匹配這些圖片標籤:
發現這些圖片的共性是,好比:<br>
```
<img src="http://images2015.cnblogs.com/blog/680022/201707/680022-20170714152746556-1823048196.jpg" />
<img src="http://images2017.cnblogs.com/blog/680022/201708/680022-20170802174118708-212238500.png" alt="" width="624" height="157" />
```
匹配表達式:
```
/http:\/\/images201[0-9].cnblogs.com\/blog\/[^>]+\/([^\/]+)\.(jpg|png)/
```
下載這些圖片:進到本身服務器的圖片目錄
```
$filename = 'blogbackup.xml';
$content = file_get_contents($filename);
preg_match_all('/http:\/\/images201[0-9].cnblogs.com\/blog\/[^>]+\/([^\/]+)\.(jpg|png)/', $content, $match);
foreach($match[0] as $img){
shell_exec('curl -O '.$img);
}
```
替換這些圖片 img.src的path路徑:我這裏用了(../images/1/xx)目錄
```
# $1匹配出圖片名稱,保持不變;$2是後綴
$re = preg_replace('/http:\/\/images201[0-9].cnblogs.com\/blog\/[^>]+\/([^\/]+)\.(jpg|png)/', '../images/1/$1.$2', $content);
file_put_contents('blogbackup_new.xml', $re);
```
再利用最新的備份blogbackup_new.xml,導入到本身的博客系統~
<br>
Okay, 終於安靜了~