- 註冊時間
- 2001-9-3
- 線上時間
- 35403 小時
- 閱讀權限
- 255
- 積分
- 2626
- 主題
- 3867
- 精華
- 78
- 文章
- 35006
TA的每日心情 | 怒 2011-4-12 00:15 |
---|
簽到天數: 3 天 連續簽到: 2 天 [LV.2]偶爾看看I - 文章
- 35006
|
花了一點時間和請多位朋友幫忙協助下寫出來的,應該算可用了
其實功能需求很簡單,只是碰上 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;
- }
複製代碼 |
|