程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 發一個剛編的暴力版/溫柔版中文截取函數

發一個剛編的暴力版/溫柔版中文截取函數

編輯:關於PHP編程

 

推薦使用暴力版的, 安全可靠; 溫柔版的從程序編寫的角度看比較高效. 呵呵

基本原理是修正 off, len 可能的錯位, 溫柔版是從 off 往前倒尋, 尋到第一個 <0xa0 的字符認為是普通字符, 搜尋結束, 根據次數判定是否有錯位...

/**
* @brief 簡潔高效的字符串截取函數 (支持 CJK字符)
*
* 只是簡單判定了高位部分的ASCII值, 能應付絕大多數正規的中英文混合字符串
* 不支持 4字節或3字節的 utf 編碼
*
* 要點: 修正雙字節中錯位的 off 值 / len 值 (注重參數 $len 缺省值為 -1的用意)
* 用法和 substr() 一樣, 針對 GBK 碼的低位(0x40開始)可能有問題
*/
function my_substr($str, $off, $len = -1)
{
$mlen = strlen($str);

/* 第0步: 參數安全檢查與修正 */
if ($off < 0)
$off = $mlen;
if ($off > $mlen)
$off = 0;

/* 第1步: $off 修正, 倒尋 */
if ($off > 0)
{
$fix = $off;
$mb = false;
do
{
$ch = ord($str{$fix--});
if ($ch < 0x80)
break;
$mb = true;
}
while ($fix);

if ($mb)
{
$fix = ($off - $fix);
if ($fix & 1)
{
$off--;
$len ;
}
}
}

/* 第2步: $len 修正, 同上 */
if ($len <= 0 || ($len $off) >= $mlen)
{
$len = $mlen - $off;
}
else
{


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved