• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 网神之王 | 发布时间: 2025-7-24 17:40| 查看数: 55| 评论数: 0|帖子模式

            在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>  //为了兼容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));
    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 $startdd)
            {
            $restr .= $c;
            }
      if(ord($str[$i])>0x80)
            {
            if($str_len>$i+1)
            {
            $c = $str[$i].$str[$i+1];
            }
            $i++;
            }
            else
            {
            $c = $str[$i];
            }
      if($i >= $enddd)
            {
            if(strlen($restr)+strlen($c)>$slen)
            {
            break;
            }
            else
            {
            $restr .= $c;
            break;
            }
            }
            }
            return $restr;
            }
    function cn_substr_utf8($str, $length, $start=0)
            {
            if(strlen($str) < $start+1)
            {
            return '';
            }
            preg_match_all("/./su", $str, $ar);
      $str = '';
            $tstr = '';
      //为了兼容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;
            }
    function cn_substr_utf82($str, $length, $start=0)
            {
            if(strlen($str) < $start+1)
            {
            return '';
            }
            preg_match_all("/./su", $str, $ar);
      $str = '';
            $tstr = '';
      //为了兼容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]) -1 ) // phpsir 加了 -1 
            {
      $str .= $ar[0][$i];
            }
            else
            {

    break;
            }
            }
            }
            return $str;
            }         
    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    最新评论

    浏览过的版块

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表