/**
* 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;
}
}