PHP分割txt纯文本小说格式章节
发布时间:2017-08-11, 16:49:59 分类:PHP | 编辑 off 网址 | 辅助
正文 4390字数 1,041,283阅读
分割<?php
$conn =file_get_contents('ss.txt'); //读取内容
$conn=mb_convert_encoding($conn,"UTF-8","GBK");//设置不乱码
$arr = explode('三体Ⅲ 死神永生 ',$conn);//用#号把标题扩起来分割,('#'也可以用其它的代替)
$nk=0;
foreach($arr as $v){
if($nk) s($nk,$v);
$nk++;
}
for($i=1;$i<$nk;$i++){
$open=file_get_contents($i.'.txt');
$openarr=explode("\r\n",$open);
if(!$nstr) $nstr=$openarr['0'];
else $nstr.="\r\n".$openarr['0'];
}
s(0,$nstr);
return false;
$result = array();
echo '';
var_dump($arr);
//var_dump($v1); //不懂得小伙伴可以打印一下,,也可以私聊我>
echo '
';
for($i = 1; $i < count($arr); $i++){ //循环数组,达到小说章节做为键,章节内容做为值
$result[$arr[$i]] = $arr[$i+1];
$i ++;
}
$k1 = array();
$v1 = array();
$nk=0;
foreach ($result as $key => $v) {
$k1[] = $key;
$v1[] = $v;
s($nk,$key);
$nk++;
s($nk,$v);
}
function s($n,$content){
$file = $n.'.txt';//要写入文件的文件名(可以是任意文件名),如果文件不存在,将会创建一个
if(file_put_contents($file, $content,FILE_APPEND)){
// 这个函数支持版本(PHP 5)
//echo "写入成功。<br />";
return true;
}
return false;
}
/*echo '';
var_dump($k1);
var_dump($v1); //不懂得小伙伴可以打印一下,,也可以私聊我>
echo '
';*/
Run code
Cut to clipboard
查看
<?php
header("content-Type: text/html; charset=UTF-8");
$t=$_GET['t'];
function o($n,$t){
$conn =file_get_contents($t.'/'.$n.'.txt');
//$conn=mb_convert_encoding($conn,"UTF-8","GBK");//设置不乱码
return $conn;
}
$slist=explode("\r\n",o('0',$t));//读取目录
//当前章节内容
$gn=$_GET['gn']+0;
$gns=$_GET['gns']+0;
$nc=o($gn,$t);
$nclist=explode("\r\n",$nc);
$ncon=count($nclist);
$ns=13;
if($ncon<$ns) $ns=$ncon;
foreach($nclist as $v){
$k++;
//$v=str_ireplace("\r\n",'<br />',$v);
$sv.=$v.'<br />';
if($k>($ns-1)){
$sa[]=$sv;
$sv='';
$k=0;
}
}
if(!$gn && $_COOKIE['gn'] && $t==$_COOKIE['t']){
header('Location:v.php?gn='.$_COOKIE['gn'].'&gns='.$_COOKIE['gns'].'&t='.$t);
exit;
}
if($t!=$_COOKIE['t']){
setcookie("t", "", time()-36000000);
setcookie("gn", "", time()-36000000);
setcookie("gns", "", time()-36000000);
}
if($t) setcookie('t',$t,time()+36000000);
if($gn) setcookie('gn',$gn,time()+36000000);
if($gns) setcookie('gns',$gns,time()+36000000);
?>
<!DOCTYPE html>
<html>
<head>
<title><?php echo $slist[$gn];?>-lizhenqiu.com</title>
<style>
*{padding:0px;margin:0px;}
#main{margin:18px;line-height:33px;}
body{background: #2e882e;}
.laypageskin_yahei a{background:#fff;}#biuuu_city{margin-top: 28px;}
.mul li{list-style:none;}
.mul li a{color:#000;text-decoration: none;}
</style>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<meta name="format-detection" content="telephone=no" />
<script src="laypage/laypage.js"></script>
</head>
<body>
<div id="main">
<?php
echo $sa[$gns];
?>
<br /><div id="biuuu_city"></div><br />
<ul class="mul">
<?php
foreach($slist as $sk=>$sv){
$sk++;
echo '<li><a href="v.php?gn='.$sk.'&t='.$t.'" ';
if($sk==$gn) echo 'style="color:#fff;"';
echo '>'.$sv.'</a></li>';
}
?>
</ul>
</div>
<script>
//调用分页
laypage({
cont: 'biuuu_city',
skin: 'yahei',
curr: '<?php echo $gns;?>',
pages: '<?php echo count($sa);?>',
groups: 10,
first: false,
last: false,
jump: function(e, first){ //触发分页后的回调
if(!first){ //一定要加此判断,否则初始时会无限刷新
location.href = 'v.php?gn=<?php echo $gn;?>&t=<?php echo $t;?>&gns='+e.curr;
}
}
})
</script>
</body>
</html>
Run code
Cut to clipboard
php 写内容到文件,把日志写到log文件
(支付宝)给作者钱财以资鼓励 (微信)→
有过 5 条评论 »
header("Content-type: text/html; charset=utf-8"); $kw=iconv("GBK","utf-8",$_GET['kw']); //将字符串的编码从GB2312转到UTF-8 if(!$kw) $kw=$_GET['kw']; $kw=char($kw); @mysql_query("set names utf8mb4"); <meta http-equiv="content-type" content="text/html;charset=utf-8">
function getSafeStr($str){ $s1 = iconv('utf-8','gbk',$str); $s0 = iconv('gbk','utf-8',$s1); if($s0 == $str){ return $str;//'utf-8'; }else{ return iconv('gbk','utf-8',$str);//'gbk' } }
也可以在id=1后通过and符号多增加多个判断,如果‘id=1 and 1=1’页面正常,‘id=1 and 1=2’时页面不正常,则这个页面边可能存在注入。
$conn =file_get_contents('2.txt'); //读取内容 $conn=mb_convert_encoding($conn,"UTF-8","GBK");//设置不乱码 $arr = explode('#',$conn);用#号把标题扩起来分割,('#'也可以用其它的代替) $result = array(); for($i = 1; $i < count($arr); $i++){ //循环数组,达到小说章节做为键,章节内容做为值 $result[$arr[$i]] = $arr[$i+1]; $i ++; } $k1 = array(); $v1 = array(); foreach ($result as $key => $v) { $k1[] = $key; $v1[] = $v; } //var_dump($k1); //var_dump($v1); //不懂得小伙伴可以打印一下,,也可以私聊我>
最近在做一个自动分割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 完成了
但是就在滚动页面的时候却发现同一个章节的名字却被匹配出来两次甚至更多。。这个错误很严重啊,之前人家作者写了一章的内容,用这个一分变成好多章了。。
于是就在匹配出每一章的章节名的时候和距离他最近的读取出来的章节名进行对比,看是不是一样。
于是就在最开始定义了一个空的字符串变量
每次循环的时候都与当前章节名进行对比 如果一样,就不再把当前的这一个章节名记录下来,如果不一样就记录下了并把章节名赋给这个变量。
虽然还有一点不尽人意的地方,但是主要的功能基本都已经实现了
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
<?php $newwstt=mb_substr($r['name'],2,4,'utf-8'); $r['name']=str_ireplace($newwstt,'<span class="fcred">'.$newwstt.'</span>',$r['name']); ?>
浏览器识别不了\n或\r\n,这两个换行符是文本换行符,文本文件有效;
如果需要将结果输出到浏览器或打印到显示器,代码中使用br;
如果只是在源代码中换行,则使用\n或\r\n
<?php echo'hello</br>'; echo'world!'; ?>
world!
<?php echo'hello\n';//unix系统使用\n;windows系统下\r\n echo'world!'; ?>
分析:浏览器识别不了\n或\r\n,这两个换行符是文本换行符,文本文件有效;在网页中查看HTML源代码可以发现代码b成功实现了换行
总结:如果需要将结果输出到浏览器或打印到显示器,代码中使用</br>;如果只是在源代码中换行,则使用\n或\r\n
Windows、Unix、Mac不同操作系统的换行问题-剖析回车符\r和换行符\n
一、概念:
换行符‘\n’和回车符‘\r’
(1)换行符就是另起一行 --- '\n' 10 换行(newline) (2)回车符就是回到一行的开头 --- '\r' 13 回车(return)
所以我们平时编写文件的回车符应该确切来说叫做回车换行符
二、应用:
(1)在微软的MS-DOS和Windows中,使用“回车CR('\r')”和“换行LF('\n')”两个字符作为换行符; (2)Windows系统里面,每行结尾是 回车+换行(CR+LF),即“\r\n”; (3)Unix系统里,每行结尾只有 换行CR,即“\n”; (4)Mac系统里,每行结尾是 回车CR 即'\r'。
三、影响:
(1)一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;
(2)而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
(3)Linux保存的文件在windows上用记事本看的话会出现黑点。
四、可以相互转换:
在linux下,命令unix2dos 是把linux文件格式转换成windows文件格式,命令dos2unix 是把windows格式转换成linux文件格式。
在不同平台间使用FTP软件传送文件时, 在ascii文本模式传输模式下, 一些FTP客户端程序会自动对换行格式进行转换. 经过这种传输的文件字节数可能会发生变化.
如果你不想ftp修改原文件, 可以使用bin模式(二进制模式)传输文本。
一个程序在windows上运行就生成CR/LF换行格式的文本文件,而在Linux上运行就生成LF格式换行的文本文件。
“Unix系统里,每行结尾只有 换行CR,即“\n”” 应该修改为: “Linux/Unix系统里,每行结尾只有 换行LF,即“\n””。 另外,其实很多人不知道 CR 和 LF 是什么的缩写: CR: 回车(Carriage Return) \r LF: 换行(Line Feed) \n