微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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) {

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐