首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>php>php技巧>正文

搜索和替换文件或目录的一个好类

http://www.oklinux.cn  2003-05-01  来源: 互联网    会员收藏  游客收藏  【 】 
这是个非常有用的程序,可以对文本文件进行特定的搜索,并以特定的文字替换指定的文字,举个例子说如果我这篇文章里有一个字全部打错了,有几十处,要一一找出来修改是件很麻烦的事,用下面这个就可以轻松搞定。--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()."rn";
echo '啊,错误发生如下.............: '.$sr->get_last_error()."rn";
?>

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

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

上一篇:贴个购物车的类,只用了一个Session   下一篇:数字转换为中文的类


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·数字转换为中文的类
·贴个购物车的类,只用了一个Session
·无限分类&树型论坛的实现
·树型结构列出指定目录里所有文件的PHP类
·新作模板处理类
·使用PHP4中的 IntegratedTemplate类实现BLOCK功能
·一个PHP类
·如何文档化你的PHP类
·一个比较完善的购物车类
·日历类
·屏蔽浏览器缓存另类方法
·一个饼状图或柱状图php生成类或例子
·判断WebSERVER类型
·一个操作xml的类
·面向过程与面向对象的简单比较
·一个翻页类
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·PHP之COOKIE支持详解
·PHP中的类
·php中文处理函数
·通过ODBC连接的SQL
·两个日期类
·面向对象编程
·面向过程与面向对象的简单比较
·判断WebSERVER类型
·屏蔽浏览器缓存另类方法
·日历类
·如何文档化你的PHP类
·使用PHP4中的 IntegratedTemplate类实
  阅读排行
·PHP之COOKIE支持详解
·PHP 应用程序配置模式
·用 PHP 读取文件的正确方法
·利用单元测试对PHP 代码进行检查
·五个常见 PHP 数据库问题
·用 PHP V4 开发的代码迁移到 PHP V5
·使用PHP 快速生成Flash 动画
·Linux系统下PHP服务器安全配置技巧
·Linux操作系统下的多线程编程详细解析
·用PHP读取和编写XML DOM
·用Pear加速PHP程序开发
·如何用PHP调用自己编写的COM组件?
·PHP面向对象编程快速入门
·为 Linux 和 Windows 安装 PHP 和 Orac
·终于实现简体转繁体,繁体到转体
网摘收藏: