谈在一个将TXT按章节分割的PHP程序中的收获

最近在做一个自动分割txt小说的东西,能够将一整个txt文件按照章节进行分割,然后分解成一个个小的.txt文件保存起来并且能够获取有多少章节和每章的章节名。

我最初的想法是:

① 先使用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 完成了

但是就在滚动页面的时候却发现同一个章节的名字却被匹配出来两次甚至更多。。这个错误很严重啊,之前人家作者写了一章的内容,用这个一分变成好多章了。。

于是就在匹配出每一章的章节名的时候和距离他最近的读取出来的章节名进行对比,看是不是一样。

于是就在最开始定义了一个空的字符串变量

每次循环的时候都与当前章节名进行对比 如果一样,就不再把当前的这一个章节名记录下来,如果不一样就记录下了并把章节名赋给这个变量。

虽然还有一点不尽人意的地方,但是主要的功能基本都已经实现了

时间: 2024-12-08 03:03:15

谈在一个将TXT按章节分割的PHP程序中的收获的相关文章

BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第8章节--配送SP2013Apps 应用程序生命周期

BEGINNING SHAREPOINT? 2013 DEVELOPMENT 第8章节--配送SP2013Apps 应用程序生命周期 你在商店拥有一个应用程序后,跟踪任何人们碰到的问题并发布更新以添加新功能,或者更改任何问题是非常重要的.任何生态系统中,一个流行的应用程序经常有负责人的开发人员,帮助客户解决问题,并发布更新更正常见问题.另外,客户喜欢购买应用程序,并希望看到随着日常更新和功能增强带来的价值增加.

在一个升序的但是经过循环移动的数组中查找指定元素

数组是升序的,数组经过循环移动之后,肯定是有左半部分或者有半部分还是升序的. 代码: public class SearchRotateArray { public static int search(int a[], int l, int u, int x) { while(l<=u){ int m = (l+u)/2; if(x==a[m]){ return m; }else if(a[l]<=a[m]){ //左半部分升序排列 if(x>a[m]){ l=m+1; }else if

PHP全国省市区地址分割提取脚本程序

github地址: https://github.com/zmxfree/addressapart 比如将 浙江省杭州市江干区XX路X号 分割成 浙江省 杭州市 江干区 XX路X号,方便excel操作. 目前支持大部分中国省市区地址信息的分割,可以自行更新地址源信息. 主程序代码: <?php /**- * 省市区地址分割 * 将 浙江省杭州市江干区XX路X号 分割成 浙江省 杭州市 江干区 XX路X号 * User: [email protected] * Date: 14-6-18 * Ti

浅谈多线程在java程序中的应用

在一个高并发的网站中,多线程是必不可少的.下面先说一下多线程在程序中的作用.1.提高前端请求的响应速度.当我们执行一个比较耗时的方法时,http请求得不到响应甚至会超时,这时如果业务上允许数据的延迟,我们可以使用多线程来进行处理比较耗时的方法.这样前端发送了请求,后端令开启了一个线程去处理任务,就不会阻塞主线程了.2.减清服务器的压力.包括我们的web容器,如tomcat.jetty等,还有数据库服务器等.因为我们使用了多线程,并且线程池大小有限制,如30,那么同时请求数据库的链接就限制为30了

解决java mail发送TXT附件被直接显示在正文中的问题

这两天遇到一个问题,关于使用java mail发送邮件的问题. 详细是这样子的:我使用java mail发送异常报告邮件,邮件中有一个包含异常日志的附件,和关于设备信息的邮件正文.假设日志为log后缀名,那么在我的qq邮箱中显示正常.可是假设把附件的后缀名改为txt之后,就变成把附件中的内容直接显示在邮件正文中了.而我原来设置的邮件正文则不在了. 我的代码是这样写的: 加入附件: public void addAttachment(String filePath, String fileName

Android 在一个程序中启动另一个程序

Android 开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用. 一般我们知道了另一个应用的包名和MainActivity的名字之后便可以直接通过如下代码来启动: Intent intent = new Intent(Intent.ACTION_MAIN); intent.add

浅谈Java前奏,背景,JRE,JVM以及程序执行过程

好久没学习Java了,来复习一遍java的第一章吧. 一.特征--跨平台原理 1.语言的分类 1)机器语言  优点:直接运行,速度快   缺点:不能跨平台 2)c.c++等编译型语言 使用特定的编译器针对特定的平台,将代码一次性的翻译成该平台所能识别的机器指令,并包装为该平台所能识别的文件,可以脱离开发环境运行 优点:高效   缺点:可移植性不强 3)perl,basic等解释型语言 使用专门的解释器,针对特定的平台,解释成该平台所能识别的机器码指令,解释一条执行一条 优点:可移植性好   缺点

Excel Macro宏 - 指定路径下两个TXT文件Copy后,导入Excel中并进行对比

由于Excel格式粘贴没时间,只写关键的VBA代码和TXT文档Format示例‘ Attribute VB_Name = "CopyAndDiffer" '2015/06/24 ADD By MAOUIZAYOI Option Explicit ' Excute Interface.Sub CopyAndDiffer() ' define variables    Dim ccnSht As Object       'ccnSht is named for current conso

C#读txt文件并写入二维数组中(txt数据行,列未知)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace 二维数组 { class Program { static void Main(string[] args) { int row = 0;//行 int col = 0;//lie FileStream fs; string path = @"C:\Documents an