搜索和替换文件或目录的一个好类--很实用


Posted in PHP onOctober 09, 2006

这是个非常有用的程序,可以对文本文件进行特定的搜索,并以特定的文字替换指定的文字,举个例子说如果我这篇文章里有一个字全部打错了,有几十处,要一一找出来修改是件很麻烦的事,用下面这个就可以轻松搞定。--teaman.oso.com.cn
类文件 search_replace.inc
<?php

        class search_replace{

                var $find;
                var $replace;
                var $files;
                var $directories;
                var $include_subdir;
                var $ignore_lines;
                var $ignore_sep;
                var $occurences;
                var $search_function;
                var $last_error;

        //以下进行函数定义和设置

                function search_replace($find, $replace, $files, $directories = '', $include_subdir = 1, $ignore_lines = array()){

                        $this->find            = $find;
                        $this->replace         = $replace;
                        $this->files           = $files;
                        $this->directories     = $directories;
                        $this->include_subdir  = $include_subdir;
                        $this->ignore_lines    = $ignore_lines;

                        $this->occurences      = 0;
                        $this->search_function = 'search';
                        $this->last_error      = '';

                }

        /***************************************
        ** Accessor for retrieving occurences.
        ***************************************/
                function get_num_occurences(){
                        return $this->occurences;
                }

        //获取最后的错误
                function get_last_error(){
                        return $this->last_error;
                }

        //设置FIND变量
                function set_find($find){
                        $this->find = $find;
                }

        //设置replace变量
                function set_replace($replace){
                        $this->replace = $replace;
                }

        //设置FILE变量
                function set_files($files){
                        $this->files = $files;
                }

        //设置目录变量
                function set_directories($directories){
                        $this->directories = $directories;
                }

        //设置目录变量 set_include_subdir
                function set_include_subdir($include_subdir){
                        $this->include_subdir = $include_subdir;
                }

        //设置ignore_lines变量
                function set_ignore_lines($ignore_lines){
                        $this->ignore_lines = $ignore_lines;
                }

        //确定是哪一种搜索方式
                function set_search_function($search_function){
                        switch($search_function){
                                case 'normal': $this->search_function = 'search';
                                               return TRUE;
                                               break;

                                case 'quick' : $this->search_function = 'quick_search';
                                               return TRUE;
                                               break;

                                case 'preg'  : $this->search_function = 'preg_search';
                                               return TRUE;
                                               break;

                                case 'ereg'  : $this->search_function = 'ereg_search';
                                               return TRUE;
                                               break;

                                default      : $this->last_error      = 'Invalid search function specified';
                                               return FALSE;
                                               break;
                        }
                }

        //以下为搜索和替换程序的主文件
                function search($filename){

                        $occurences = 0;
                        $file_array = file($filename);

                        for($i=0; $i<count($file_array); $i++){
                                $continue_flag = 0;
                                if(count($this->ignore_lines) > 0){
                                        for($j=0; $j<count($this->ignore_lines); $j++){
                                                if(substr($file_array[$i],0,strlen($this->ignore_lines[$j])) == $this->ignore_lines[$j]) $continue_flag = 1;
                                        }
                                }
                                if($continue_flag == 1) continue;
                                $occurences += count(explode($this->find, $file_array[$i])) - 1;
                                $file_array[$i] = str_replace($this->find, $this->replace, $file_array[$i]);
                        }
                        if($occurences > 0) $return = array($occurences, implode('', $file_array)); else $return = FALSE;
                        return $return;

                }

        //使用quick(快速)搜索方法时,没有igonre_lines功能
                function quick_search($filename){

                        clearstatcache();

                        $file       = fread($fp = fopen($filename, 'r'), filesize($filename)); fclose($fp);
                        $occurences = count(explode($this->find, $file)) - 1;
                        $file       = str_replace($this->find, $this->replace, $file);

                        if($occurences > 0) $return = array($occurences, $file); else $return = FALSE;
                        return $return;

                }

        //preg搜索方法不支持ignore_lines
                function preg_search($filename){

                        clearstatcache();

                        $file       = fread($fp = fopen($filename, 'r'), filesize($filename)); fclose($fp);
                        $occurences = count($matches = preg_split($this->find, $file)) - 1;
                        $file       = preg_replace($this->find, $this->replace, $file);

                        if($occurences > 0) $return = array($occurences, $file); else $return = FALSE;
                        return $return;

                }

        //ereg搜索方法也不支持ignore_lines
                function ereg_search($filename){

                        clearstatcache();

                        $file = fread($fp = fopen($filename, 'r'), filesize($filename)); fclose($fp);

                        $occurences = count($matches = split($this->find, $file)) -1;
                        $file       = ereg_replace($this->find, $this->replace, $file);

                        if($occurences > 0) $return = array($occurences, $file); else $return = FALSE;
                        return $return;

                }

        //写新文件
                function writeout($filename, $contents){

                        if($fp = @fopen($filename, 'w')){
                                fwrite($fp, $contents);
                                fclose($fp);
                        }else{
                                $this->last_error = 'Could not open file: '.$filename;
                        }

                }

        //由do_search调用,排出所有要搜索的文件
                function do_files($ser_func){
                        if(!is_array($this->files)) $this->files = explode(',', $this->files);
                        for($i=0; $i<count($this->files); $i++){
                                if($this->files[$i] == '.' OR $this->files[$i] == '..') continue;
                                if(is_dir($this->files[$i]) == TRUE) continue;
                                $newfile = $this->$ser_func($this->files[$i]);
                                if(is_array($newfile) == TRUE){
                                        $this->writeout($this->files[$i], $newfile[1]);
                                        $this->occurences += $newfile[0];
                                }
                        }
                }

        //由do_search()调用,排出所有要搜索的目录
                function do_directories($ser_func){
                        if(!is_array($this->directories)) $this->directories = explode(',', $this->directories);
                        for($i=0; $i<count($this->directories); $i++){
                                $dh = opendir($this->directories[$i]);
                                while($file = readdir($dh)){
                                        if($file == '.' OR $file == '..') continue;

                                        if(is_dir($this->directories[$i].$file) == TRUE){
                                                if($this->include_subdir == 1){
                                                        $this->directories[] = $this->directories[$i].$file.'/';
                                                        continue;
                                                }else{
                                                        continue;
                                                }
                                        }

                                        $newfile = $this->$ser_func($this->directories[$i].$file);
                                        if(is_array($newfile) == TRUE){
                                                $this->writeout($this->directories[$i].$file, $newfile[1]);
                                                $this->occurences += $newfile[0];
                                        }
                                }
                        }
                }

        //调用这个do_search()就可以开始对文件或目录进行搜索
                function do_search(){
                        if($this->find != ''){
                                if((is_array($this->files) AND count($this->files) > 0) OR $this->files != '') $this->do_files($this->search_function);
                                if($this->directories != '')                                       $this->do_directories($this->search_function);
                        }
                }

        } // End of class
?>

//下面是调用该类的例子说明,请存为example.php

<?php

        include('search_replace.inc');  //将文件包括进来

//建立新物件,设置搜索条件、最后返回搜索结果

        $sr = new search_replace('asp', 'php', array('test.txt')); //调用搜索与替换
        $sr->set_search_function('quick');   //设置搜索条件
        $sr->do_search();

        $sr->set_find('another');
        $sr->do_search();

//下面是定制的返回信息
        header('Content-Type: text/plain');
        echo '发现和替换以下几个地方: '.$sr->get_num_occurences()."\r\n";
        echo '啊,错误发生如下.............: '.$sr->get_last_error()."\r\n";
?>

//将以下文字存为test.txt,注意text.txt必须是可读可写的
"我非常喜欢asp,它简单易学,功能强,听说asp已经占了大半市场,asp真好。"

此时,如果您打开exampe.php 就会出现下面这些:
发现和替换以下几个地方:3
啊,错误发生如下..........:      
查看test.txt文件,果然出现asp的地方被php替换了。

PHP 相关文章推荐
PHP+APACHE实现用户论证的方法
Oct 09 PHP
隐藏你的.php文件的实现方法
Mar 19 PHP
php设计模式 State (状态模式)
Jun 26 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
Jan 27 PHP
php表单提交与$_POST实例分析
Jan 26 PHP
php中动态变量用法实例
Jun 10 PHP
php生成图片验证码的实例讲解
Aug 03 PHP
PHP递归遍历多维数组实现无限分类的方法
May 06 PHP
CI框架中redis缓存相关操作文件示例代码
May 17 PHP
php中的单引号、双引号和转义字符详解
Feb 16 PHP
php基于session锁防止阻塞请求的方法分析
Aug 07 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 PHP
非常好的php目录导航文件代码
Oct 09 #PHP
PHP4.04简明安装
Oct 09 #PHP
利用 window_onload 实现select默认选择
Oct 09 #PHP
将RTF格式的文件转成HTML并在网页中显示的代码
Oct 09 #PHP
简单的用PHP编写的导航条程序
Oct 09 #PHP
信用卡效验程序
Oct 09 #PHP
用文本文件实现的动态实时发布新闻的程序
Oct 09 #PHP
You might like
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
javascript 建设银行登陆键盘
2008/06/10 Javascript
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
纯文字版返回顶端的js代码
2013/08/01 Javascript
JS实现时间格式化的方式汇总
2013/10/16 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
浅谈JavaScript超时调用和间歇调用
2015/08/30 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
JavaScript正则表达式简单实用实例
2017/06/23 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
2021/02/26 Vue.js
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
python算法学习之基数排序实例
2013/12/18 Python
Python下的Softmax回归函数的实现方法(推荐)
2017/01/26 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
Python实现简易Web爬虫详解
2018/01/03 Python
wxPython之解决闪烁的问题
2018/01/15 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
对Python中一维向量和一维向量转置相乘的方法详解
2019/08/26 Python
python中adb有什么功能
2020/06/07 Python
思想政治教育专业个人求职信范文
2013/12/20 职场文书
面试后的英文感谢信
2014/02/01 职场文书
十八届三中全会个人学习材料
2014/02/13 职场文书
大学生创业项目方案
2014/03/08 职场文书
请假条怎么写
2014/04/10 职场文书
护士求职信范文
2014/05/24 职场文书
社区春季防火方案
2014/06/02 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
团日活动总结格式
2015/05/11 职场文书
2016中秋节问候语
2015/11/11 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书
详解CSS故障艺术
2021/05/25 HTML / CSS
html+css实现文字折叠特效实例
2021/06/02 HTML / CSS
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库