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

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

*/


之前從別的地方down下一些頁面文件,需要批量修改其中一些內容。所以就做了這個類。
目前主要功能有:
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_ireplace($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_ireplace($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 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;
	}

	/*
	*  正則替換文件內容(忽略大小寫)、編碼、後綴名
	*
	*  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;
	}

}


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