-
農業機械設備類網站織夢...
-
環保設備研發制造類網站...
-
中藥藥材百科資訊類網站...
-
攝影拍攝短視頻類網站織...
-
道路護欄交通設施類網站...
-
水性工業漆類企業網站織...
-
LED顯示屏中英雙外貿類網...
-
新媒體自媒體運營資訊類...
-
汽車配件類網站織夢模板...
-
車輛機油工業潤滑油類網...
-
APP應用程序官網類網站織...
-
園林綠化景觀建設類網站...
-
水上樂園設備類網站織夢...
-
園林景觀設計類網站織夢...
-
灶具電器設備類網站織夢...
-
企業公司行業通用類網站...
-
辦公學習教程資訊類網站...
-
環保電動掃地車類網站織...
-
潮流資訊信息類網站織夢...
-
網站建設營銷類網站織夢...
edecms 的cn_substr_utf8字符串截取函數商榷
在phpsir看到的這篇文章,主要是說下dedecms 的cn_substr_utf8函數好像有些問題,研究dedecms的朋友可以看下
在dedecms里面cn_substr_utf8函數代碼如下
/*** utf-8中文截取,單字節截取模式** @access public* @param string $str 需要截取的字符串* @param int $slen 截取的長度* @param int $startdd 開始標記處* @return string*/if ( ! function_exists('cn_substr_utf8')) {function cn_substr_utf8($str, $length, $start=0) {if(strlen($str) < $start+1) {return '';}preg_match_all("/./su", $str, $ar);$str = '';$tstr = '';</p> <p> //為了兼容mysql4.1以下版本,與數據庫varchar一致,這里使用按字節截取for ($i=0; isset($ar[0][$i]); $i++) {if(strlen($tstr) < $start) {$tstr .= $ar[0][$i];} else {if(strlen($str) < $length + strlen($ar[0][$i]) ) {$str .= $ar[0][$i];} else {break;}}}return $str;}}
其中
if(strlen($str) < $length + strlen($ar[0][$i]) )
一行可能會造成截取后多了一個字符,可以改為
if(strlen($str) < $length + strlen($ar[0][$i]) -1 )
測試代碼
$f = "你好fasdfa你fasdf#e#";$pos = strpos($f,'#e#');var_dump($pos);var_dump(cn_substr_utf8($f,$pos));var_dump(cn_substr_utf82($f,$pos));</p> <p>function cn_substr($str, $slen, $startdd=0) {global $cfg_soft_lang;if($cfg_soft_lang=='utf-8') {return cn_substr_utf8($str, $slen, $startdd);}$restr = '';$c = '';$str_len = strlen($str);if($str_len < $startdd+1) {return '';}if($str_len < $startdd + $slen || $slen==0) {$slen = $str_len - $startdd;}$enddd = $startdd + $slen - 1;for ($i=0;$i<$str_len;$i++) {if($startdd==0) {




