博客搬家了~


原来写在<a href="http://www.cnblogs.com/firstForEver/">博客园的博客</a>,搬家了~  新博客地址:http://www.hansongda.club/

前几天花了三头二百买了一年的服务器资源,正好前段时间研究研究Laravel框架,就搭建了一个博客系统。<br>


服务|版本
---|---
Linux|CentOS 7.1
nginx|1.8
mysql|5.6
php|7.1
redis|4.0
Laravel|5.4


迁移过程:<br/>

一开始很头疼原来的博客文章,怎么导过来...
想主意怎么爬取下来,后来意外惊喜的发现博客园右上角有个备份按钮,马上点击一下试试。荡下来是个XML文件,CDATA部分都是以html存在的文章内容。
<br>
妥了!解析XML就okay了..
<br>展现PHP最好的语言了,直接处理xml的函数

```
simplexml_load_file()

```

尴尬的发现这个函数,默认不能解析出来CDATA部分数据...没查手册,马上想到是用正则解析出来这部分数据:

备份下的xml文章内容的格式如下:

```

<description><![CDATA[<p> Laravel框架中间件使用</p> ]]></description>

<description><![CDATA[<p> 浮点数乘积以后取整,得到的数不符预期</p>]]></description>

```

如果用正则匹配CDATA区的数据,需要用到<b>零宽向前/后匹配</b>和<b>非贪婪</b>两个知识点。

```

# 左匹配 <description><![CDATA[
# 右匹配 ]]></description>
# 文章内容利用 [sS]*?,问号? 非贪婪模式匹配

preg_match_all('/(?<=<description><![CDATA[)([sS]*?)(?=]]></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, 终于安静了~

原文地址:https://www.cnblogs.com/firstForEver/p/8179147.html