TXT小说断章实现

2012-9-1

上个版本伊书支持TXT格式,免不了要做断章功能,粗略分享下断章的过程。

总体上的步骤很简单,只有两步:

  1. 用正则找出所有包含“第X章”的位置,保存在一个数组
  2. 循环处理这个数组,第i组的位置和第i+1组的位置之间就是这一章的内容,提取出来保存。

但有许多地方要处理和注意:

  1. “第”字和“章”字之间的数字不能过多,否则可能是错误的匹配。
  2. “第X章”这样的关键字有可能出现在正文,必须去除这样的匹配。(据测试QQ阅读没去掉这样的匹配)
  3. 除了“章”字,还有其他关键字,如“卷”“节”“部”等。针对以上三条,最后使用的正则:@”\\s{1}第(.{1,5})(章|节|集|卷|部|篇)”
    前面的一个\\s{1}保证不匹配在正文里出现的“第X章”,中间限制1到5个字,达到中文计数的百位(如“一百二十一”),应该够了。最后收集了除了“章”之外的一些关键字,可能还不全。
  4. 章节标题的提取。TXT上的章节标题可能是“第X章 XXX”这样,之前匹配的只是第X章,要把后面的字也作为章节标题提取。方法是在匹配到的第X章的位置找后面30个字符内的第一个换行符,匹配到这一行的文字就是章节标题。若30个字符内没换行,就以“第X章”为标题。
  5. 开头结尾的特殊处理,匹配到的第一个“第X章”关键字要把这个位置之前的内容作为一章。匹配到的最后一章不再以下一个匹配的位置作结尾,而是全文最末为结尾。
  6. 在无法匹配到章节内容时,采用普通分段方法,把全文按每章大概固定的字数分段。这样分段时在截取固定长度的字符串后向后查找最后一个换行符,以这个换行符的位置为点分段。目前使用普通分段的情况是匹配到的章节数小于4,或章节内容过长。

经过以上这些处理后,分章是有点靠谱了,但还有一些情况没考虑到,需要慢慢完善。

分类:技术文章
评论

2012年9月2日 15:47

很棒!加油!

2012年12月25日 17:59

你好,请问下,你这个分章后,怎么定位到该章节呢。比如,我点了第4章,然后我进入时,怎么定位到第4章呢

2012年12月26日 12:48

保存每章的范围到数据库,定位时根据这个范围取

2013年11月25日 16:25

第(.{1,5})(章|节|集|卷|部|篇) 兄弟这个1,5正则php指的是字节,对于 “第一百二十三章”这种,5个字节不够用。还有可以加个“回”字。

2015年4月15日 14:49

如果需要支持的的章节格式增多,使用正则表达式查找章节就会变的很慢。最后不得已放弃了使用正则表达式的方法,采用了二进制的方式查找章节。

2016年4月14日 14:42

我曾经写的一个 第[0-9零千百一二三四五六七八九十 ]{1,10}(章).*|前\s?言\s*\n|引\s?子\s*\n|楔\s?子\s*\n
用于text转epub 切割文件

2016年4月14日 14:43

表示自己都快看不懂了

2018年2月13日 14:26

贡献一个, 用calibre上text转mobi在kindle上看小说用的.

“`
^.{0,6}(第[0-9一两二三四五六七八九十零百千]{1,6}(章|节|集|卷|部|篇|回)|楔子|前言|引子)([ \s\:]{0,2}|:)([^\s]{0,36})$

2018年4月21日 11:10

楼主是使用的nodejs读取的txt文档吗?