一個字串可能帶有 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);
六七八九十</span>A running dog ram into a sleeping elephant.";
print StubUTF8String($str,32);
輸出結果
中國字英文 一二三四五 六七八九十A running dog
多個空白和換行都被取代為一個空白' ',ram這個字取不完整捨棄,最後輸出共30個字元
編修 2009-10-28 23:36:03