其他分享
首页 > 其他分享> > dedecms字符串截取函数怎么用

dedecms字符串截取函数怎么用

作者:互联网

dedecms 的cn_substr_utf8字符串截取函数商榷

在phpsir看到的这篇文章主要是说下dedecms 的cn_substr_utf8函数好像有些问题,研究dedecms的朋友可以看下

在dedecms里面 cn_substr_utf8 函数是这样的

代码如下:

01/**
02* utf-8中文截取,单字节截取模式
03*
04* @access public
05* @param string $str 需要截取的字符串
06* @param int $slen 截取的长度
07* @param int $startdd 开始标记处
08* @return string
09*/
10if ( ! function_exists('cn_substr_utf8')) {
11function cn_substr_utf8($str, $length, $start=0) {
12if(strlen($str) < $start+1) {
13return '';
14}
15preg_match_all("/./su", $str, $ar);
16$str = '';
17$tstr = '';
18</p> <p> //为了兼容mysql4.1以下版本,与数据库varchar一致,这里使用按字节截取
19for ($i=0; isset($ar[0][$i]); $i++) {
20if(strlen($tstr) < $start) {
21$tstr .= $ar[0][$i];
22else {
23if(strlen($str) < $length + strlen($ar[0][$i]) ) {
24$str .= $ar[0][$i];
25else {
26break;
27}
28}
29}
30return $str;
31}
32}

其中

代码如下:

1if(strlen($str) < $length + strlen($ar[0][$i]) )

一行可能会造成截取后多了一个字符,可以考虑改为

代码如下:

1if(strlen($str) < $length + strlen($ar[0][$i]) -1 )

测试代码如下

代码如下:

查看源码打印代码帮助
01$f = "你好fasdfa你fasdf#e#";
02$pos = strpos($f,'#e#');
03var_dump($pos);
04var_dump(cn_substr_utf8($f,$pos));
05var_dump(cn_substr_utf82($f,$pos));
06</p> <p>function cn_substr($str, $slen, $startdd=0) {
07global $cfg_soft_lang;
08if($cfg_soft_lang=='utf-8') {
09return cn_substr_utf8($str, $slen, $startdd);
10}
11$restr = '';
12$c = '';
13$str_len = strlen($str);
14if($str_len < $startdd+1) {
15return '';
16}
17if($str_len < $startdd + $slen || $slen==0) {
18$slen = $str_len - $startdd;
19}
20$enddd = $startdd + $slen - 1;
21for ($i=0;$i<$str_len;$i++) {
22if($startdd==0) {

标签:slen,cn,截取,startdd,dedecms,substr,str,字符串,strlen
来源: https://blog.csdn.net/zxy840552216/article/details/118696800