YBoy 發表於 2007-6-21 15:21:39

一個PHP命令行模式的範例(簡體轉繁體)

本程式將以命列列的方式執行PHP程式,主要流程是
要求使用者輸入檔案或目錄
檢查該目錄或檔案是否存在
若是目錄的話,逐層去讀取並建立新目錄
若是檔案的話,則進行轉換並建立新檔案



請先下載map檔.
http://203.68.102.46/online_book/data/12/24/big5.map



#! /usr/local/bin/php -q
<?php
while(!file_live());
echo "\n您所輸入的是:".$dir_name."\n";
$stdin = fopen('php://stdin', 'r');
echo "\n***************************************************************************************
本程式會將您指定的檔案或目錄(包含目錄底下的檔案)由簡體轉換成繁體
所轉成的檔案或目錄會將至於您所指定的目錄的同一層,並於檔案或目錄前面加上\"big5_\"作為識別
本程式不做任何擔保,請評估後自行決定使用!
***************************************************************************************\n";
echo "\n您確定要執行本程式?確定請按,離開請按\n";

$sure = fgets($stdin,100);
$sure=substr($sure,0,-1);
if($sure!="y") { echo "\n再見!\n"; exit;}
register_shutdown_function('goodbye');
trim($dir_name);
if(substr($dir_name,-1)=="/") $path=substr($path,0,-1);
$dir_array = explode("/",$dir_name);
end($dir_array);
$key=key($dir_array);
if(is_dir($dir_name)) {//若為目錄則呼叫rec進行轉換
$len=strlen(substr(strrchr ($dir_name, "/"),1));
$n_len=$len*-1;
$new_dir=substr($dir_name,0,$n_len)."big5_".substr(strrchr ($dir_name, "/"),1);
if(mkdir ($new_dir, 0755)) {
echo "建立目錄".$new_dir."\n";
get_file($dir_name,$key);
}else{
echo "目錄".$new_dir."已經存在,請先刪除\n";
}
}else{
$str=Gb_Big5($dir_name);
$len=strlen(substr(strrchr ($dir_name, "/"),1));
$n_len=$len*-1;
$ddir_name=substr($dir_name,0,$n_len)."big5_".substr(strrchr ($dir_name, "/"),1);
$FP=fopen ($ddir_name, "w+");
if($FP) echo "檔案".$ddir_name."建立\n";
fwrite ($FP, $str);
fclose ($FP);
}


function get_file($dir_name,$key){
$d = dir($dir_name);
while($entry = $d->read()){
if($entry=="." || $entry=="..") continue;
$ddir_name=$dir_name."/".$entry;
if(is_dir($ddir_name)){
$ddir_array=explode("/",$ddir_name);
$ddir_array[$key]="big5_".$ddir_array[$key];
$new_dir=implode("/",$ddir_array);
if(mkdir ($new_dir, 0755)) {
echo "建立子目錄".$new_dir."\n";
get_file($ddir_name,$key);
}
} else{
echo $ddir_name."轉換中...\n";
$str=Gb_Big5($ddir_name);
$ddir_array=explode("/",$ddir_name);
$ddir_array[$key]="big5_".$ddir_array[$key];
$new_dir=implode("/",$ddir_array);
$FP=fopen ($new_dir, "w+");
if($FP) echo "檔案".$new_dir."建立\n";
fwrite ($FP, $str);
fclose ($FP);
}
}
$d->close();
}




function Gb_Big5($file) {
//var $gb_map="gb.map"; //如果要放到別的路徑,要加上完整路徑
$big5_map="/root/php_shell/big5.map"; //例如 ="/home/table/gb.map
$dep_char = 127;
$str=file_get_contents($file);
$fd = fopen ($big5_map, "r");
$str=str_replace("charset=gb2312","charset=big5", $str);
$outstr="";
for($i=0;$i<strlen($str);$i++) {
$ch=ord(substr($str,$i,1));
if($ch > $dep_char) {
$outstr.=cgb_big5(substr($str,$i,2),$fd);
//echo $outstr."\n";
$i++;
} else {
$outstr.=substr($str,$i,1);
}
}
fclose ($fd);
return $outstr;

}

function cgb_big5($str,$fd) {
$c=ord(substr($str,0,1));
$x=ord(substr($str,1,1));
$address=(($c-160)*510)+($x-1)*2;
fseek($fd, $address);
$hi=fgetc($fd);
$lo=fgetc($fd);
//echo "$hi$lo";
return "$hi$lo";
}

function file_live(){
global $dir_name;
$stdin = fopen('php://stdin', 'r');
if($dir_name) echo "\n您所輸入的檔案或目錄不存在!";
echo "\n請輸入您要簡體變繁體的檔案或目錄完整名稱:";
$dir_name = fgets($stdin,100);
fclose($stdin);
$dir_name=substr($dir_name,0,-1);

if( is_dir($dir_name) || is_file($dir_name)) {
return $dir_name;
}else{
return 0;
}
}

function goodbye(){

echo "\n程式執行完畢!\n";

}

?>
頁: [1]
查看完整版本: 一個PHP命令行模式的範例(簡體轉繁體)