php版本的字符串截取方法如何通過判斷長度來顯示指定的更多'...'標記

2016-12-05 20:03:00
hainuo
原創 2135
摘要:PHP的字符串截取方法判斷是否更多的方法
在處理字符串截取的時候遇到一箇有趣的問題在使用`mb_strlen()`方法是第一次沒有指定牠的第二箇蔘數 導緻字符串截取時齣錯先上原來的方法```function msubstr($str, $start, $length, $suffix = '', $charset = "utf-8"){ if (mb_strlen($str) <= $length) $suffix = false; if (function_exists("mb_substr")) $slice = mb_substr($str, $start, $length, $charset); elseif (function_exists('iconv_substr')) { $slice = iconv_substr($str, $start, $length, $charset); if (false === $slice) { $slice = ''; } } else { $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/"; $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/"; $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/"; $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/"; preg_match_all($re[$charset], $str, $match); if (count($match[0]) <= $length) $suffix = false; $slice = join("", array_slice($match[0], $start, $length)); } return $suffix ? $slice . $suffix : $slice;}```可以看到我在使用`mb_strlen()`方法時隻指定瞭一箇蔘數另一箇沒有指定.這時候我們對`陶企技術革命一觸卽髮`進行處理(多於12箇字的時候進行截斷併在後麵附上'...')在服務器端(windows)髮現情況是這樣的`陶企技術革命一觸卽髮...`。在我本地(mac os 10.12)是正常的。於是我在方法的一開始加入瞭這樣的語句進行調試```#此方法判斷字符串長度有問題,如需使用請往下看function msubstr($str, $start, $length, $suffix = '', $charset = "utf-8"){ echo(mb_strlen($str) . '-' . $length . '--'); if (mb_strlen($str) <= $length).....}```然後再到服務器端進行查看得到結果服務器端結果:`30-12--陶企技術革命一觸卽髮...` 本地結果:`10-12--陶企技術革命一觸卽髮` 臥槽。。。。這是什麽鬼?難道是編碼的問題?將調試語句更改爲`echo(mb_strlen($str) . '-' . mb_internal_encoding() . '--');`服務端結果:`30-ISO-8859-1--陶企技術革命一觸卽髮...`本地結果:`10-UTF-8--陶企技術革命一觸卽髮`於是髮覺問題齣在字符串編碼上果斷在`mb_strlen($str,'utf-8')`;服務器與本地結果一緻`10-UTF-8--陶企技術革命一觸卽髮`;結論,如果你在使用字符串截取等對編碼佔位要求比較嚴格的方法時請務必帶上你指定的字符串編碼。最後截取的方法修改爲如下```function msubstr($str, $start, $length, $suffix = '', $charset = "utf-8"){ if (mb_strlen($str, $charset) <= $length) $suffix = false; if (function_exists("mb_substr")) $slice = mb_substr($str, $start, $length, $charset); elseif (function_exists('iconv_substr')) { $slice = iconv_substr($str, $start, $length, $charset); if (false === $slice) { $slice = ''; } } else { $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/"; $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/"; $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/"; $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/"; preg_match_all($re[$charset], $str, $match); $slice = join("", array_slice($match[0], $start, $length)); } return $suffix ? $slice . $suffix : $slice;}```endupdate 20161206 經詢問髮現windows服務器是64位,但是使用的php版本位32位的。
發錶評論
捌 乘 玖 =
評論通過審核後顯示。