首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 中文字串截取函式(支援 GB2312 與 UTF-8)完整實作

     編輯:PHP 相關知識

PHP 中文字串截取函式(支援 GB2312 與 UTF-8)完整實作

PHP 內建 substr() 截取中文易產生亂碼,以下提供處理 GB2312 與 UTF-8 的自訂函式。

GB2312 版本

function substr_for_gb2312($str, $start, $len = null) {
    $totlelength = strlen($str);
    if ($len === null) $len = $totlelength;
    if ($len == 0) return "";
    if ($len >= $totlelength && $start == 0) return $str;
    if ($start > $totlelength) return "";
    // 處理負數 start
    if ($start < 0) {
        if (abs($start) >= $totlelength) $start = 0;
        else $start = $totlelength - abs($start);
    }
    // 確保起始位置不切分雙位元組字元
    if ($start > 0) {
        $i = $start - 1;
        $flag = -1;
        while ($i >= 0) {
            if (ord(substr($str, $i, 1)) > 160) $flag = -1 * $flag;
            else break;
            $i--;
        }
        if ($flag == 1) { $start--; $len++; }
    }
    $str = substr($str, $start);
    $totlelength = strlen($str);
    // 處理負數 len
    if ($len < 0) $len = $totlelength - abs($len);
    if ($len <= 0) return "";
    // 確保結束位置不切分雙位元組字元
    $i = min($len, $totlelength) - 1;
    $flag = -1;
    while ($i >= 0) {
        if (ord(substr($str, $i, 1)) > 160) $flag = -1 * $flag;
        else break;
        $i--;
    }
    if ($flag == 1) $len--;
    return substr($str, 0, $len);
}

UTF-8 版本(簡易)

function substr_for_utf($str, $len) {
    $new_str = array();
    for ($i = 0; $i < $len; $i++) {
        $temp_str = substr($str, 0, 1);
        if (ord($temp_str) > 127) {
            $i++;
            if ($i < $len) {
                $new_str[] = substr($str, 0, 3);
                $str = substr($str, 3);
            }
        } else {
            $new_str[] = substr($str, 0, 1);
            $str = substr($str, 1);
        }
    }
    return join($new_str);
}

UTF-8 版本(支援 start 參數,使用正則)

function utf8_substr($string, $start, $length) {
    preg_match_all('/[\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF4][\x80-\xBF]{3}/', $string, $rs);
    $out = '';
    $size = count($rs[0]);
    $end = $start + $length;
    if ($end > $size) $end = $size;
    for ($i = $start; $i < $end; $i++) {
        $out .= $rs[0][$i];
    }
    return $out;
}

補充工具推薦:

更多 PHP 相關內容請參考本站專題:《PHP 數學運算技巧總結》、《PHP 操作 Office 文件技巧總結》、《PHP 陣列操作技巧大全》、《PHP 排序演算法總結》、《PHP 常用遍歷演算法與技巧總結》、《PHP 資料結構與演算法教程》、《PHP 程式設計演算法總結》、《PHP 正則表達式用法總結》、《PHP 運算與運算子用法總結》、《PHP 字串用法總結》及《PHP 常見資料庫操作技巧匯總》。

希望本文能對您的 PHP 程式設計有所幫助。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved