最近在做一個自動分割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 完成了
但是就在滾動頁面的時候卻發現同一個章節的名字卻被匹配出來兩次甚至更多。。這個錯誤很嚴重啊,之前人家作者寫了一章的內容,用這個一分變成好多章了。。
於是就在匹配出每一章的章節名的時候和距離他最近的讀取出來的章節名進行對比,看是不是一樣。
於是就在最開始定義了一個空的字符串變量
每次循環的時候都與當前章節名進行對比 如果一樣,就不再把當前的這一個章節名記錄下來,如果不一樣就記錄下了並把章節名賦給這個變量。
雖然還有一點不盡人意的地方,但是主要的功能基本都已經實現了