PALMisLIFE 討論區
標題:
中英文排版調整功能
[列印本頁]
作者:
阿輝
時間:
2008-5-29 10:13
標題:
中英文排版調整功能
花了一點時間和請多位朋友幫忙協助下寫出來的,應該算可用了
其實功能需求很簡單,只是碰上 Big5 編碼時,單純的切字會造成很多問題,因此大部分的時間其實都是在解決 Big5 編碼上會造成的問題
相關原因建議推薦參考
提倡易讀、標準的文章標題
[PHP 英文中文排版程式]
英文與中文之間自動加空白,例如 測試test測試 --> 測試 test 測試
.,!? 等特殊符號與中文之間加空白,但是只加在後面,例如 測試!測試 --> 測試! 測試
[](){} 等對等符號與中文之間加空白,但只加在外側,例如 測試[測試]測試 --> 測試 [測試] 測試
// 檢查是否為中文字,並分左右,為中文字左側輸出 -1 ,右側輸出 0
function is_chinese(&$str, $location) {
$ch = true;
$i = $location;
while(ord($str[$i])>0xa0 && $i >= 0) {
$ch = !$ch;
$i --;
}
if($i != $location) {
$f_str = $ch ? 1: -1;
} else {
$f_str = false;
}
return $f_str;
}
// [PHP 英文中文排版程式]
// 英文與中文之間自動加空白,例如 測試test測試 --> 測試 test 測試
// .,!? 等特殊符號與中文之間加空白,但是只加在後面,例如 測試!測試 --> 測試! 測試
// [](){} 等對等符號與中文之間加空白,但只加在外側,例如 測試[測試]測試 --> 測試 [測試] 測試
function add_space($str) {
$L = '\(\[\{\<';
$R = '\)\]\}\>\,\.\!\,\?\;\:';
$change = '/^[a-zA-Z0-9_,.!?'.$L.$R.']$/';
$len = strlen($str);
for($i = 0;$i <$len;$i++) {
$j = $i + 1;
if (is_chinese($str, $i) == "-1") {
$result_str .= substr($str,$i,2);
$nextpass = 1; // 設定已取兩字元,下一迴圈就不要重複取字
} else {
// 檢查是否有空白、左字元、右字元,有的話就略過處理
if ((substr($str,$i,1) == " ")
OR (substr($str,$j,1) == " ")
OR (preg_match('/^['.$L.']$/', substr($str,$i,1)))
OR (preg_match('/^['.$R.']$/', substr($str,$j,1)))
)
{
if ($nextpass == 1) { $nextpass = 0;} else {$result_str .= substr($str,$i,1);}
} else {
$itest = preg_match($change, substr($str,$i,1));
$jtest = preg_match($change, substr($str,$j,1));
// 這是避免中文第二字是英文造成的錯誤
if ($nextpass == 1) {$itest = 0;}
if ($itest XOR $jtest) {
if ($nextpass == 1) { $nextpass = 0;} else {$result_str .= substr($str,$i,1);}
$result_str .= " ";
//echo "!";
//echo "a=".preg_match($change, substr($str,$i,1)).";b=".preg_match($change, substr($str,$j,1));
//echo substr($str,$i,1);
//echo strlen(is_chinese($str, $i).is_chinese($str, $j));
} else {
if ($nextpass == 1) { $nextpass = 0;} else {$result_str .= substr($str,$i,1);}
}
}
}
}
return $result_str;
}
複製代碼
歡迎光臨 PALMisLIFE 討論區 (http://f.pil.tw/)
Powered by Discuz! X2.5