帝国cms的文章模型,是将文章内容存储在了其d/txt目录下,一般以日期为目录存储,但是有的时候,我们会想要将全站的某个字符串(文字,词语等),其他模型其实比较简单,甚至是他的所有的模板,都是存在了数据库中,这样的好处不仅仅是备份方便,我们在替换字符时也方便,用我之前说过的一个sql语句即可:UPDATE table_name
SET field_name
= replace (field_name
,’from_str’,'to_str’) WHERE …… ;而这个文章模型比较特殊,他是为了读取速度,将内容存在了一个php文件中,这样仅仅存一个路径,当然就快了,他的文章模型就很适合做小说。但是我们想批量替换某个字符就比较麻烦了,所以我简单写了个功能,来完成这个目的;
效果如图:当点击确定后,会将包含有指定字符的文件目录列出并替换掉;
先说说原理,任何事情,其实明白了原理,就有了解决的步骤,一步步来就可以解决,既然知道了内容存储的文件,那么我们写个程序,遍历这个目录,然后读取里面的文件,查找里面是否有指定字符,如果有就用正则进行批量替换即可;上代码;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<?php set_time_limit(0); //文件权限要可读可写 //替换的目录,替换的字符,替换后的字符 function recurDir($dir,$txt='',$new='') { if(is_dir($dir)) { if($handle = opendir($dir)) { while(false !== ($file = readdir($handle))) { if(is_dir($dir.'/'.$file)) { if($file != '.' && $file != '..') { $path = $dir.'/'.$file; recurDir($path,$txt,$new); } }else{ $path = $dir.'/'.$file; change($path,$txt,$new); } } } closedir($handle); } } function change($dir,$txt='',$new=''){ $f = file_get_contents($dir); if(strpos($f,$txt)){ $f = str_ireplace($txt,$new,$f); file_put_contents($dir,$f); echo $dir.'<br />'; } } $sub = @$_POST['sub']; if($sub){ $oldw = @$_POST['oldw']; $neww = @$_POST['neww']?@$_POST['neww']:''; if($oldw){ recurDir('txt',$oldw,$neww); } } ?> <form action="" method="post"> 要替换的字符:<input type="text" name="oldw" /><br /><br /> 替换后的字符:<input type="text" name="neww" /><br /><br /> <input type="submit" name="sub" value="确定" /> </form> |
ps:将这个代码写入一个php文件,并且放到帝国根目录的/d/目录下,注意文件字符格式,如果你的帝国程序是utf-8注意将此文件保存为utf-8格式;访问这个文件既可以,注意操作前,你可以先测试或者备份一下这个/d/txt目录,确认可以了就可以用了。
这里我没有加登陆限制,可以将他后台的几个包含文件加上就有个是限制非登陆访问的,当然了这个仅仅是为了替换字符,可以使用完就删除,或者在顶部加上exit;仅仅用到的时候来用。其实这个东西很简单,喜欢对有此类似问题的同学有帮助。
程序本天成,妙手偶得之!我们只是代码的搬运工!
转载请注明:http://www.521php.com/archives/1609/
2013年10月19日 下午 8:34 黄山烧饼 | 引用 | #1
沙发呀