ホームページ > バックエンド開発 > PHPチュートリアル > ディレクトリを走査し、ファイルの内容をバッチで置き換えるクラスを作成しました。

ディレクトリを走査し、ファイルの内容をバッチで置き換えるクラスを作成しました。

WBOY
リリース: 2016-06-23 14:11:58
オリジナル
907 人が閲覧しました

このクラスは、以前に必要になったときに作成しました。
機能:
1 ディレクトリ内のすべてのファイルを走査します (サフィックス名を指定可能)
2 ファイルの内容 (通常、文字列) をバッチで置換します
3 ファイルのサフィックス名をバッチで置換します
4 ファイルエンコーディングをバッチで置換します

使用例:

$dirExplorer = new DirExplorerClass();$dirExplorer->getDirExplorer('D:/test1/test2/');                                  //遍历目录D:/test1/test2/$dirExplorer->modifyFileBy_replace('aa','QQ','shift-jis','UTF-8','txt','TXT');    //将所有文件内容中的aa替换为QQ,文件编码从shift-jis转换为UTF-8,将所有txt的后缀名改为TXT
ログイン後にコピー


クラスコード:
class DirExplorerClass{	var $dirPath_array = array();//遍历文件结果集合	function __construct(){		//donothing	}	/*	*  return a directory handle or die        */	private function openDir($dirPath_target) {		if (is_dir($dirPath_target)) {			return opendir($dirPath_target);		}else {			die("$dirPath_target is Not a Directory");		}	}	/*	*  close a directory handle        */	private function closeDir($dirHander) {		closedir($dirHander);	}	/*	*  遍历指定目录,返回其下的文件名集合	*	*  Parameters:	*  	1 dirPath:需要遍历的文件夹	*  	2 extension:只返回指定后缀名的文件 	*  Return:	*  	遍历文件结果集合        */	function getDirExplorer($dirPath,$extension=''){		$dirHander=$this->openDir($dirPath);		while($fileName = readdir($dirHander)){			if($fileName !='.' && $fileName !='..'){				$path = $dirPath."/" . $fileName;				if(is_dir($path)){					$this->getDirExplorer($path);				}else{					if(isset($extension) && $extension != ''){						$fileExtension = end(explode('.',$fileName));						if($fileExtension != $extension){							continue;						}					}					$this->dirPath_array[]=$path;				}			}		}		$this->closeDir($dirHander);		return $this->dirPath_array;	}	/*	*  字符串替换文件内容(区别大小写)、编码、后缀名	*	*  Parameters:	*  	1 search:	需要替换的字符串 (数组可)	*  	2 replace:	替换后的字符串 (数组可)	*  	3 in_charset:	原编码	*  	4 out_charset:	新编码	*  	5 in_extension:	原后缀名	*  	6 out_extension:新后缀名	*  Return:	*  	true or false        */	function modifyFileBy_replace($search, $replace, $in_charset='', $out_charset='', $in_extension='', $out_extension=''){		/* input check */		if(			!isset($search) || !isset($replace) || 			(strlen($in_charset)!=0 && strlen($in_charset)==0)  || (strlen($in_charset)==0 && strlen($in_charset)!=0) ||			(strlen($in_extension)!=0 && strlen($out_extension)==0)  || (strlen($in_extension)==0 && strlen($out_extension)!=0)		){			return false;		}		foreach($this->dirPath_array as $key=>$file) {			$content = file_get_contents($file);//read contents			$content = str_replace($search, $replace, $content);			if(strlen($in_charset)!=0 && strlen($out_charset)!=0){				/* change the encode */				$this->changeCharset($in_charset, $out_charset, 1, $content);			}			unlink($file);			if(strlen($in_extension)!=0 && strlen($out_extension)!=0){				/* change file's extension */				$this->changeExtension($in_extension, $out_extension, 1, $file);			}			file_put_contents($file, $content);			unset($content);			/* 更新遍历文件名结果集 */			$this->dirPath_array[$key] = $file;		}		return true;	}	/*	*  字符串替换文件内容(忽略大小写)、编码、后缀名        */	function modifyFileBy_ireplace($search, $replace, $in_charset='', $out_charset='', $in_extension='', $out_extension=''){		//不贴了 和上面的modifyFileBy_replace一样 只是用str_ireplace替换而已	}	/*	*  正则替换文件内容(忽略大小写)、编码、后缀名	*	*  Parameters:	*  	1 search:	需要替换内容的正则表达式	*  	2 replace:	替换后的字符串	*  	3 in_charset:	原编码	*  	4 out_charset:	新编码	*  	5 in_extension:	原后缀名	*  	6 out_extension:新后缀名	*  Return:	*  	true or false        */	function modifyFileBy_regex($search, $replace, $in_charset='', $out_charset='', $in_extension='', $out_extension=''){		/* input check */		if(			!isset($search) || !isset($replace) || 			(strlen($in_charset)!=0 && strlen($in_charset)==0)  || (strlen($in_charset)==0 && strlen($in_charset)!=0) ||			(strlen($in_extension)!=0 && strlen($out_extension)==0)  || (strlen($in_extension)==0 && strlen($out_extension)!=0)		){			return false;		}		if(preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[1], 'e') !== false)) {			/* remove eval-modifier from $search */			$search = substr($search, 0, -strlen($match[1])) . preg_replace('![e\s]+!', '', $match[1]);		}		foreach($this->dirPath_array as $key=>$file) {			$content = file_get_contents($file);//read contents			$content = preg_replace($search, $replace, $content);			if(strlen($in_charset)!=0 && strlen($out_charset)!=0){				/* change the encode */				$this->changeCharset($in_charset, $out_charset, 1, $content);			}			unlink($file);			if(strlen($in_extension)!=0 && strlen($out_extension)!=0){				/* change file's extension */				$this->changeExtension($in_extension, $out_extension, 1, $file);			}			file_put_contents($file, $content);			unset($content);			/* 更新遍历文件名结果集 */			$this->dirPath_array[$key] = $file;		}		return true;	}	/*	*  变换编码	*	*  Parameters:	*  	1 in_charset:	原编码	*  	2 out_charset:	新编码	*  	3 flag:		0对遍历得到的文件转换编码 1对指定内容转换编码	*  	4 content:	仅在flag为1时使用	*  Return:	*  	true or false        */	function changeCharset($in_charset='', $out_charset='', $flag=0, &$content=''){		/* input check */		if (strlen($in_charset)==0 || strlen($out_charset)==0){			return false;		}		if($flag == 0){			/* 对遍历得到的文件转换编码 */			foreach($this->dirPath_array as $file) {				$content = file_get_contents($file);//read contents				/* change the encode */				$content = iconv($in_charset, $out_charset, $content);				unlink($file);				file_put_contents($file, $content);				unset($content);			}		}else{			/* 对指定内容转换编码 */			if(strlen($content) != 0){				$content = iconv($in_charset, $out_charset, $content);			}		}		return true;	}	/*	*  变换后缀名	*	*  Parameters:	*  	1 in_extension:		原后缀名	*  	2 out_extension:	新后缀名	*  	3 flag:			0对遍历得到的文件变换后缀名 1对指定文件名变换后缀名	*  	4 fileName:		仅在flag为1时使用	*  Return:	*  	true or false        */	function changeExtension($in_extension='', $out_extension='', $flag=0, &$fileName=''){		/* inout check */		if(strlen($in_extension)==0 || strlen($out_extension)==0){			return false;		}		if($flag == 0){			/* 对遍历得到的文件变换后缀名 */			foreach($this->dirPath_array as $key=>$file) {				/* change file's extension */				$tmp = explode('.',$file);				$nowExtension = array_pop($tmp);				if($nowExtension == $in_extension){					$content = file_get_contents($file);//read contents					unlink($file);					$file = implode('.',$tmp).'.'.$out_extension;					file_put_contents($file, $content);					unset($content);				}				/* 更新遍历文件名结果集 */				$this->dirPath_array[$key] = $file;			}		}else{			/* 对指定文件名变换后缀名 */			if(strlen($fileName) != 0){				$tmp = explode('.',$fileName);				$nowExtension = array_pop($tmp);				if($nowExtension == $in_extension){					$fileName = implode('.',$tmp).'.'.$out_extension;				}			}		}		return true;	}}
ログイン後にコピー


ディスカッションへの返信(解決策)

これはとても強力です、私はそれを学びました~

lz あなたはとても素晴らしいです。 。 。 。 。 。 。 。

追加点、追加点、追加点

悪くない

しかし、いくつかはまだ不規則です
例:modifyFileBy_replace はキャメルケース形式であり、アンダースコア区切り形式です

public を使用するのは無駄です
private 関数を開始する必要がありますwith _

悪くない

ただし、いくつかはまだ不規則です
たとえば、modifyFileBy_replace はキャメルケース形式であり、アンダースコア区切り形式です

パブリック関数は使用できません public
プライベート関数は _ で始める必要があります
はい
あまり標準化されていません

非常に不規則です! ! !

プライベート関数 openDir($dirPath_target)
プライベート関数 closeDir($dirHander)
これら 2 つのメソッドは存在する必要はなく、ネイティブ関数を呼び出すだけです

再帰メソッド (getDirExplorer) で作業メソッドをコールバックすることをお勧めします) 代わりに、ディレクトリ ツリー全体を構築した後、作業関数を使用してそれを処理します。
たとえば、アプリケーションはファイルの内容を置き換えるだけです。

ftgyhu

これは非常に不規則です。 ! ! こんな感じです

プライベート関数 openDir($dirPath_target)

プライベート関数 closeDir($dirHander)

これら 2 つのメソッドは存在する必要はなく、内部でネイティブ関数を呼び出すだけです

で作業メソッドをコールバックすることをお勧めしますディレクトリ ツリー全体を構築してから作業関数で処理する代わりに、再帰的メソッド (getDirExplorer) を使用します。

必ずしもディレクトリ ツリーに戻る必要はありません。たとえば、アプリケーションはテキストを置き換えるだけです。
これら 2 つのメソッドを書き換える予定がある場合は、削除してください。
機能するメソッドに関しては、主な理由は次のとおりであることを期待することです。このクラスにはある程度の汎用性があります
この例では、この関数は少しごちゃ混ぜになっていますが、テキストの置換、エンコーディング、サフィックス名の変更はすべて 1 回の走査で実行されます。ただし、実際にはエンコーディングまたはサフィックスのみを変換したい場合があるため、これら 2 つは実際には 2 つの別個の関数として提供されます。したがって、トラバーサルと各関数を分離することを検討し、自由に呼び出しを選択してください。

関数の実行後にいつでも最新の走査結果セットを返すことができる __get を追加することを計画します。

学べてよかった~

わかりました、ありがとう! ! !

学んでください

これはとても強力です、学んでください~

学んでください。

突然、間違ったセクションに入ったことに気づきました、OMG

とても良かったです!学んだ。

いいですね!

4 階の yangball からの返信を引用:

悪くはない

しかし、いくつかはまだ不規則です

例:modifyFileBy_replace は一時的にキャメルケースになり、時にはアンダースコア区切り形式になります

パブリック関数を使用するのは無駄です
プライベート関数_ で始まるはずです

そうです
あまり標準化されていません
標準化されているかどうかに関係なく、書かれると非常に強力です 何個書けますか?

奉仕


この投稿は xuzuning によって最終編集されました: 2011-06-24 13:44:35

 /*    *  遍历指定目录,返回其下的文件名集合    *    *  Parameters:    *      1 dirPath:需要遍历的文件夹    *      2 extension:只返回指定后缀名的文件     *  Return:    *      遍历文件结果集合        */    function getDirExplorer($dirPath,$extension=''){        $dirHander=$this->openDir($dirPath);        while($fileName = readdir($dirHander)){            if($fileName !='.' && $fileName !='..'){                $path = $dirPath."/" . $fileName;                if(is_dir($path)){                    $this->getDirExplorer($path);                }else{                    if(isset($extension) && $extension != ''){                        $fileExtension = end(explode('.',$fileName));                        if($fileExtension != $extension){                            continue;                        }                    }                    $this->dirPath_array[]=$path;                }            }        }        $this->closeDir($dirHander);        return $this->dirPath_array;    }
ログイン後にコピー

良い事

yidingdianer,yebucuo,bucuo

学びました。 。

はは、そうですか、glob を使用するとコードがいくらか減るかもしれません

これらの関数は実際には比較的一般的であり、Linux では 3 行または 4 行のシェルで実行できます

まずため息をつきます。書かないでください、私はそれを持っていません 辛抱強く



して質問してください:

SPL を使用しないのはなぜですか?
SplFileInfo、SplFileObject、およびイテレータを使用する方が良いはずです

さらに、PHP は Windows で Unicode ファイル名を処理する際に依然として致命的な問題を抱えているため、PHP 開発者が改善することを期待するしかないため、現在のコードではこの問題を考慮する必要があります

辛抱強く読んでください。よく書かれました!

ただし、一部のコードの効率は改善されるはずです

たとえば、end(explode('.',$fileName)); を substr(strrchr($fileName,'.'),1); に変更すると、これが起こる可能性があります。より効率的に!

ただし、一部のコードの効率は改善されるはずです。

たとえば、end(explode('.',$fileName)) を substr(strrchr($fileName,'.'),1); に変更すると、これはより効率的になる可能性があります高くなるでしょう!
そうですね
アドバイスありがとうございます、書き直すときに最適化します

書けない、忍耐力がないので最初にため息をつきます


それから質問します。 :

SPL を使用してみませんか?
SplFileInfo、SplFileObject、およびイテレータを使用する方が良いはずです

さらに、Windows での Unicode ファイル名の処理に関しては、PHP はまだ行き詰まっています。PHP 開発者には改善を期待するしかないため、現在のコードではこれを考慮する必要があります。問題がありました
アドバイスありがとうございます
SplFileInfo と SplFileObject は違います 週末にチェックしてみてください

ファイルのエンコーディングを自動的に検出してターゲットのエンコーディングに変換するなど、期待していた機能が表示されませんでした...


ポスターはとても強力です、前からやろうと思っていましたが、よく考えたら、その時はだめでした

いくつかの点を与えてください

マーク

ハオ

わかりません、わかりません、分かりません、分かりません、分かりません、分かりません、分かりません、分かりません、分かりません、分かりません、分かりませんわかりません、わかりません、わかりません、わかりません、わかりません、わかりません、わかりません、わかりません、わかりません、わかりません、わかりません、わかりません

もっと学びましょう

名前を変更すれば解決します

良いことです
共有してくれてありがとう

学び、ありがとう、オリジナルポスター~~

わかりません

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート