【Php】遍歷目錄下文件、批量替換文件內容等功能的一個類V2

/**
 * Author:RDP
 * My mail:[email protected]
 * My blog: blog.teamhaka.com

*/


這是之前寫的第二個版本。之前的請參考《【Php】遍歷目錄下文件、批量替換文件內容等功能的一個類》

相較於之前的版本有以下不同:

  V1 V2
對文件操作的動作 在遍歷目錄後的再次循環中操作(多次循環) 遍歷目錄的過程中通過回調函數直接操作(一次循環)
部分代碼的優化 end(explode('.',$fileName)) substr(strrchr($fileName,'.'),1)
自命名規則的調整 不統一  自命名函數變量均採用駝峯命名
代碼行數(不包括使用說明) 近300行 200行

代碼如下:

/**
 * Author:[email protected]
 * My blog: http://blog.teamhaka.com/
 *
 * -概述
 *	通過執行getDirExplorer函數進行遍歷目錄操作。在遍歷目錄的同時,可採用註冊動作函數的方式對每個文件進行相關動作處理。
 *
 * -功能:
 *	1 遍歷目錄下的所有文件(可指定後綴名)
 *	2 批量替換文件內容(正則、字符串)
 *	3 批量替換文件後綴名
 *	4 批量替換文件編碼
 *
 * -介紹和使用例:
 *	1 public函數
 *		Array getDirExplorer (string $dirPath [, string  $extension=''] [, Array $actionArray=array()])
 *		返回值:
 *			遍歷後得到的文件名數組
 *		參數說明:
 *			$dirPath	【必須參數】需要遍歷的文件夾
 *			$extension 	【可選參數】指定後綴名 只返回指定後綴名的文件
 *			$actionArray 	【可選參數】儲存對文件進行相關操作的函數、參數的數組。此數組可以是以下幾種值之一或其組合:
				$actionArray = array(
 *					'modifyByIreplace'	=> array($search, $replace),		忽略大小寫的文本替換
 *					'modifyByReplace'	=> array($search, $replace),		不忽略大小寫的文本替換
 *					'modifyByRegex'		=> array($search, $replace),		正則表達式進行文本替換
 *					'changeCharset'		=> array($inCharset, $outCharset),		改變文件的字符編碼
 *					'changeExtension'	=> array($inExtension, $outExtension)	改變文件的後綴名
 *				)
 *
 *	2 例:
 *		下面的代碼將遍歷目錄【F:/test/】下的所有文件(不指定後綴名),並對其下文件中後綴名爲TXT的修改爲txt,然後將所有文件的字符編碼從UTF-16變更爲UTF-8,
 *		最後將文件內容中的tester替換爲test。
 *		(注意:替換文本內容時此源碼文件的編碼和目標文件編碼應該一致。比如此DirExplorerClass源碼是utf-8,
 *		所以在下例中替換tester的操作是在目標文件已修改爲utf-8之後進行的。)
 *      	$actionArray = array(
 *			'changeExtension'=>array('TXT','txt'),
 *			'changeCharset'=>array('UTF-16','UTF-8'),
 *			'modifyByIreplace'=>array('tester','test')
 *		);
 *		$dirExplorer = new DirExplorerClass();
 *		$dirExplorer->getDirExplorer('F:/test/', '', $actionArray);
*/

class DirExplorerClass{
	private $_dirPathArray = array();//遍歷文件結果集合

	/**
	*  construct
	*/
	function __construct(){
		//donothing
	}

	/**
	*  __get - 獲取私有屬性
	*/
	public function __get($propertyName){
		return($this->$propertyName);
	}

	/**
	*  getDirExplorer - 遍歷指定目錄,返回其下的所有文件名或指定後綴的文件名集合。並在遍歷過程中可對文件進行相關操作。
	*
	*  @param dirPath - 需要遍歷的文件夾
	*  @param extension - 指定後綴名 只返回指定後綴名的文件
	*  @param actionArray - 儲存對文件進行相關操作的函數、參數的數組
	*
	*  @return 遍歷文件結果集合
        */
	public function getDirExplorer($dirPath, $extension='', $actionArray=array()){
		$dirHander = null;
		$codeArray = array();	//存儲執行動作的代碼

		//input check
		if (is_dir($dirPath) && is_array($actionArray)) {
			$dirHander = opendir($dirPath);
		}else{
			return false;
		}

		foreach($actionArray as $actionFun => $paramArray){
			if(method_exists($this,'_'.$actionFun) && is_array($paramArray) && count($paramArray)>0){
				$codeArray[] = '$this->_'.$actionFun.'(\''.implode('\', \'',$paramArray).'\', $path);';
			}else{
				//do nothing
			}
		}

		//遍歷文件夾操作 + 處理文件的各種動作
		while($fileName = readdir($dirHander)){
			if($fileName !='.' && $fileName !='..'){
				$path = $dirPath."/" . $fileName;
				if(is_dir($path)){
					$this->getDirExplorer($path);
				}else{
					if(isset($extension) && $extension != ''){
						$fileExtension = substr(strrchr($fileName,'.'),1);
						if($fileExtension != $extension){
							continue;
						}
					}

					//處理文件的各種動作
					foreach($codeArray as $code){
						@eval($code);
					}

					$this->_dirPathArray[] = $path;
				}
			}
		}
		closedir($dirHander);
		return $this->_dirPathArray;
	}

	/**
	*  _modifyByIreplace - 字符串替換文件內容(忽略大小寫)
	*
	*  @param search - 需要替換的字符串 (數組可)
	*  @param replace - 替換後的字符串 (數組可)
	*  @param file - 指定的文件
	*
	*  @return - true or false
        */
	private function _modifyByIreplace($search, $replace, $file){
		//input check
		if( !isset($search) || !isset($replace) ){
			return false;
		}

		$content = file_get_contents($file);
		$content = str_ireplace($search, $replace, $content);
		file_put_contents($file, $content);
		unset($content);

		return true;
	}

	/**
	*  _modifyByReplace- 字符串替換文件內容(區別大小寫)
	*
	*  @param search - 需要替換的字符串 (數組可)
	*  @param replace - 替換後的字符串 (數組可)
	*  @param file - 指定的文件
	*
	*  @return - true or false
        */
	private function _modifyByReplace($search, $replace, $file){
		/* input check */
		if( !isset($search) || !isset($replace) ){
			return false;
		}

		$content = file_get_contents($file);
		$content = str_replace($search, $replace, $content);
		file_put_contents($file, $content);
		unset($content);

		return true;
	}

	/**
	*  _modifyByRegex - 正則替換文件內容
	*
	*  @param search - 需要替換內容的正則表達式
	*  @param replace - 替換後的字符串
	*  @param file - 指定的文件
	*
	*  @return - true or false
        */
	private function _modifyByRegex($search, $replace, $file){
		// input check
		if( !isset($search) || !isset($replace) ){
			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]);
		}

		$content = file_get_contents($file);
		$content = preg_replace($search, $replace, $content);
		file_put_contents($file, $content);
		unset($content);

		return true;
	}

	/**
	*  _changeCharset - 變換編碼
	*
	*  @param inCharset - 原編碼
	*  @param outCharset - 新編碼
	*  @param file - 指定的文件
	*
	*  @return - true or false
        */
	private function _changeCharset($inCharset='', $outCharset='', $file){
		/* input check */
		if (strlen($inCharset)==0 || strlen($outCharset)==0){
			return false;
		}

		$content = file_get_contents($file);
		$content = iconv($inCharset, $outCharset, $content);
		unlink($file);
		file_put_contents($file, $content);
		unset($content);

		return true;
	}

	/**
	*  _changeExtension - 變換後綴名
	*
	*  @param inExtension - 原後綴名
	*  @param outExtension - 新後綴名
	*  @param file - 指定的文件
	*
	*  @return - true or false
        */
	private function _changeExtension($inExtension='', $outExtension='', &$file){
		//inout check
		if(strlen($inExtension)==0 || strlen($outExtension)==0){
			return false;
		}

		$divide = strripos($file,'.');
		if($divide===false){
			return false;
		}
		$nowExtension = substr($file,$divide+1);
		$beforePart = substr($file,0,$divide);

		if($nowExtension == $inExtension){
			$content = file_get_contents($file);
			unlink($file);
			$file = $beforePart.'.'.$outExtension;
			file_put_contents($file, $content);
			unset($content);
		}

		return true;
	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章