PHP处理小说文章内容

PHP处理小说章节并分割成文件

 

先缕清思路,

拿到一个超大TXT小说之后能干什么、是不是得按照章节给逐个分清各个小文件

 

之前我是这样想的,用正则匹配每个章节,把内容里的章节全给匹配到,再放到数组遍历用explode给逐个分割,每一章对应生成每一章的文件。开始干吧

 

 

if(preg_metch(“/[0-9一二两三四五六七八九十百千万]*[章节]/i”,$str,$matches){}

但是这样匹配不到,我上网查了一下,正则匹配得是UTF8格式的 小说一般都是GBK  后来换了一个思路

mb系列的函数先给它转换成UTF8

$str=mb_convert_encoding($str,"UTF-8","GBK");

转换之后就不乱码了,但是还是匹配不到、然后又问万能的百度,发现汉字在正则里面是

\x{4e00}-\x{9fa5}   然后又把汉字翻译成Unicode  又查阅资料重写的正则,最后成了这样

if(preg_match_all("/(\x{7b2c})(\s*)([\x{96f6}\x{4e00}\x{4e8c}\x{4e09}\x{56db}\x{4e94}\x{516d}\x{4e03}\x{516b}\x{4e5d}\x{5341}\x{767e}\x{5343}0-9]+)(\s*)([\x{7ae0}\x{8282}]+)/u",$str,$matches)){}

 

不负众望  出来了,匹配到小说里面所有的章节  赶紧去起点网对比一下   结果刚刚好,一篇不多一篇不少。

 

 

接下来就该获取章节内容了,本来 是想用explode关键字来分割内容  ,  结果实验了一下午没有成功,然后想,拿脑瓜子想,查阅资料 但是感觉这部分应该属于核心部分。没办法啦,只能靠自己了。咦,突然一瞬间启发了我,

 

 

拿内容不就是这三个标签中间的那个吗,哇 头皮发麻 章节我也有了,直接怼吧

就开始写正则

 

#$matches[$第一章](.*)$matches[$第二章]#isU


因为是正则匹配的,防止重复array_unique去重

大工告成!!!费事一天半终于成功了·····

 

 

代码在下↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

 

$bookname /*文件夹名字*/,

$re /*入库id*/,

$newName /*超大TXT小说*/

 

 

$dir="./static/book/".base64_encode($bookname);

if(!file_exists($dir))

{

            mkdir($dir,0777,true);

        }

$file_name='./static/book/'.$newName;

 

$str=file_get_contents($file_name);

 

$str=mb_convert_encoding($str,"UTF-8","GBK");

$arr=[];

 

if(preg_match_all("/(\x{7b2c})(\s*)([\x{96f6}\x{4e00}\x{4e8c}\x{4e09}\x{56db}\x{4e94}\x{516d}\x{4e03}\x{516b}\x{4e5d}\x{5341}\x{767e}\x{5343}0-9]+)(\s*)([\x{7ae0}\x{8282}]+)/u",$str,$matches))

{

$matches=array_slice($matches[0], 0,count($matches[0]));

 

for ($i=0; $i  $value)

{

preg_match($value, $str,$arr[$key]);

unset($arr[$key][0]);

}

static $bookContent=[];

foreach ($arr as $key => $value)

 {

 

 if(isset($value[1]))

 {

 $chaptername =strstr($value[1], "\n", true);

 }

 else

 {

 $chaptername='哎呀没处理好';

 }

 

 @$bookContent[$matches[$key].$chaptername]=$value[1];

 unset($bookContent[$key]);

 

 }

foreach ($arr as $key => $value)

{

 

$file_name=$dir.'/'.rand(10000,99999).'.txt';
file_put_contents($file_name, $value);


}


你可能感兴趣的:(php)