谈在⼀个将TXT按章节分割的PHP程序中的收获
最近在做⼀个⾃动分割txt⼩说的东西,能够将⼀整个txt⽂件按照章节进⾏分割,然后分解成⼀个个⼩的.txt⽂件保存起来并且能够获取有多少章节和每章的章节名。
php编程手册我最初的想法是:
①先使⽤fopen打开⽂件,然后while循环使⽤fgets函数按txt⽂件中每⼀⾏读取
②边读取边使⽤正则匹配出是否在这⼀句话中含有 “第**章”或者是“第**节”的字符串。如果有的话就把它存到⼀个数组中去。
③全部循环完成后使⽤count来计算数组的⼤⼩,然后使⽤foreach循环数组,将每⼀章的章节名进⾏字符串拼接(⽐如拼接成 '#章节名#' 这样的形式存到数据库中便于以后使⽤explode等函数进⾏章节名的分割)。
然后我就按照这个思路开始敲代码了。。但是很快便遇到了第⼀个问题
---- 如何使⽤正则表达式来匹配中⽂
之前⼀直都是使⽤正则表达式来匹配⼀些英⽂啊字符啊什么的,我也⼀直以来都以为正则表达式可以直接匹配汉字的,于是就写了下⾯这样的代码
if(preg_match("/第[0-9⼀⼆两三四五六七⼋九⼗百千万]*[章节]/i",$hangdata,$matches)){
}
我真的是把这个想的太容易了⼀点。。。结果就是什么也没有匹配出来。。
很多时候遇到问题第⼀想法就是不可能然后就⽤把这⾏简单的代码看了⼀下,却没有发现有什么问题啊。。于是便开始百度,不得不说百度真的有很多有⽤的东西,很快便到了⽹友共享的匹配中⽂字符的内容,要把汉字改成Unicode编码形式再去匹配。。。下⾯则是修改之后的代码
if(preg_match("/(\x{7b2c})(\s*)([\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",$hangdata,$matches)){ }
我想这次应该是没有问题了吧~正⾼兴着刷新了⼀下⽹页。。。我去怎么⼜没出来东西。。是不是⽹友的贡献出错了?于是仔细检查了⼀边却还是没发现有什么问题,于是⽹上个⼀个php在线中⽂⼿册看了⼀下,原来使⽤preg_match匹配中⽂要求被匹配的内容是UTF-8编码。。⽽从txt中读取出来的⼀般
是GBK编码的
于是⼜在前⾯加了⼀⾏字符转换代码
$hangdata=mb_convert_encoding($hangdata,"UTF-8","GBK");
现在⼀运⾏~OK 完成了
但是就在滚动页⾯的时候却发现同⼀个章节的名字却被匹配出来两次甚⾄更多。。这个错误很严重啊,之前⼈家作者写了⼀章的内容,⽤这个⼀分变成好多章了。。
于是就在匹配出每⼀章的章节名的时候和距离他最近的读取出来的章节名进⾏对⽐,看是不是⼀样。
于是就在最开始定义了⼀个空的字符串变量
每次循环的时候都与当前章节名进⾏对⽐如果⼀样,就不再把当前的这⼀个章节名记录下来,如果不⼀样就记录下了并把章节名赋给这个变量。
虽然还有⼀点不尽⼈意的地⽅,但是主要的功能基本都已经实现了

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。