[精讚] [會員登入]
1906

[PHP] UTF8中取出字串中特定的字數

要將字串,例如資料庫取出的TEXT,取出特定的字數

分享此文連結 //n.sfs.tw/11609

分享連結 [PHP] UTF8中取出字串中特定的字數@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-23 17:49:20 最後編修
2017-08-12 22:04:54 By 張○○
 

一個字串可能帶有 html的TAG,多餘的空白,無意義的字元,或者為了存到資料庫中而加上的反斜線,若要取出特定的字數,就得把這些內容給篩選掉

因此我撰寫一個簡單的過濾函數

function StubUTF8String($str, $length=100){
  $str = stripslashes( $str );
  $str = strip_tags( $str);    //拿掉HTML的Tag
  $str = preg_replace('/[\n\r\t]/', ' ', $str);
  $str = preg_replace('/\s(?=\s)/', '', $str);
  $str = trim($str);
  return mb_substr( $str, 0, $length, "UTF-8");
}

第2-3行 把反斜線拿掉,移除html tag
第4行 把換行、TAB、行首字元改為空白' '
第5行 移除重覆的空白
第6行 移除頭尾的空白

這樣子基本上就沒有什麼大問題,但有一個小問題就是切英文字可能會把最後一個單字正好切斷。所以得加一個檢查,先少切一個字元,如果字串最後的字元是英文+數字,則把他取代掉。舉例來說,假設字串是這樣:

$str= "中國字英文<span style=\"color:#123455\">一二三四五</span>A running dog rams into a sleeping elephant.";

若要取長度11,則切的時候就切到第12位的地方,會是一個空白:

$str= "中國字英文一二三四五A ";

再把字串尾端的空白清掉就好。

如要要切長度12,則切13位,可以發現running 這個字被切破了,只剩一個'r':

$str= "中國字英文一二三四五A r";

發現第13 位是英文字母,那從第13位開始往前刪掉直到遇到非字母或數字即可。

這樣子還會有一個問題,就是取回的字串可能比原來的短,這也是沒辦法的事,畢竟切一半的英文字或數字是不行的。

但如果正好切斷的地方是國字,那麼少切一位的結果就回傳的中文字會多一個,因此最後還要多一個檢查,當回傳結果多一位時,要把他刪掉。

改寫後的程式,這樣不論切中切英都不會有問題了:

函式

/**
    *  StubUTF8String() -- UTF8下取出字串中特定的字數
    * @param string $str 傳入的字串
    * @param  int $length 取出的字數
    * @return 取回的字串
*/
function StubUTF8String($str, $length=40){
  $str = stripslashes( $str );
  $str = strip_tags( $str);    //拿掉HTML的Tag
  $str = preg_replace('/[\n\r\t]/', ' ', $str);
  $str = preg_replace('/\s(?=\s)/', '', $str);
  $str = mb_substr( $str, 0, $length+1, "UTF-8");
  $str = preg_replace('/[a-zA-Z]+$/', '', $str);
  $str = trim($str);
  if(mb_strlen($str)>$length)$str= mb_substr( $str, 0, -1, "UTF-8");
  return $str;
}

叫用

$str= "中國字英文 <span style=\"color:#123455\">一二三四五
六七八九十</span>A running dog ram into a sleeping elephant.";
print StubUTF8String($str,32);

輸出結果

中國字英文 一二三四五 六七八九十A running dog

多個空白和換行都被取代為一個空白' ',ram這個字取不完整捨棄,最後輸出共30個字元


編修 2009-10-28 23:36:03

END

你可能感興趣的文章

[PHP] 解析二進位圖片 使用php來解析png圖片,把資料寫在16進位格式

PHP判斷對方瀏覽器語系 多語系的網頁應該主動偵查瀏覽器的語系,配合使用者跳出合適的語系。

利用 php 木馬作為駭客攻擊的手法 利用 php 木馬作為駭客攻擊的手法

[PHP8] 使用autoload autoload+ namespace +use 到了php7之後,namespace和use越來越重要,此篇整理autoload和namespace、use的結合使用。

[PHP] 判斷文字、數字、文字加數字的方法 幾個PHP數字和文字操作上的小眉角:判斷文字、數字、文字加數字的方法

[phpmyadmin] 設定預設語言(Language) phpmyadmin預設進來是會選擇你瀏覽器預設的語系,改成正體中文

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

一個邏輯的錯誤刪了全部檔案的經驗 今天本來想做一件很簡單的事,但卻足足浪費我多一倍的時間,再加上刪掉我全部的檔案,原因只是因為我自己的邏輯錯誤。

NETCRAFT發現你的網站及作業系統 NETCRAFT可以發現你的網站及作業系統

好用的3+2碼郵遞區號查詢系統推薦 網路上找到用地址輸入判斷3+2碼郵遞區號的辨識率不高,除了這個網站…

世紀帝國征服者新版本--被遺忘的帝國 世紀帝國征服者新版本--被遺忘的帝國 世紀二代的征服者是精典遊戲中的精典,aofe更好玩...

Smarty安裝 smarty 是著名的樣版引擎,非常的好用,用多了突然發現拿掉smarty反而不會寫php了,以下是安裝過程..