zoukankan      html  css  js  c++  java
  • PHP按照视觉长度截取字符串,电商网站标题截取

    由于PHP中utf8编码格式汉字占用3字节,ASCII码值占用1字节,导致切分标题显示效果长短不一,例如

    $titles = [
                '11111,,11111111111111111111111111111111111111111111111111111',
                '저 는 직장 인 입 니 다.저 는 직장 인 입 니 다.저 는 직장 인 입 니 다.',
                'Я из категории работающих. Я из категории работающих. Я из категории работающих. ',
                '33333,,33333333333333333333333333333333333333333333333333333',
                '一二三四五,,六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十',
                '哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈',
            ];

    用mb_substr切分也是有视觉差距的:

     foreach ($titles as $title) {
                echo mb_substr($title, 0, 10, 'utf-8') .'...'. PHP_EOL;
            }

    自己编写方法处理,首先把字符串按照字符切分成数组,遍历数组,用ord转换字符获取ASCII编码值,标题显示在html中ASCII值占1字节,汉字占2字节长度,

    小于127则是计算为1字节,否则计算为2字节

    (拆分字符串常用的方法参考:https://www.cnblogs.com/wherein/p/6873489.html

    public function cut_string($title, $length)
        {
            $res = preg_split('//u', $title, null, PREG_SPLIT_NO_EMPTY);
            $byteLength = $length * 2;
            $titleLength = 0;
            $result = '';
            foreach ($res as $item) {
                $result .= $item;
                $titleLength += (ord($item) < 127) ? 1 : 2;
                if ($titleLength >= $byteLength) {
                    $result .= '...';
                    break;
                }
            }
            return $result;
        }
    
    
        public function test()
        {
    
            $titles = [
                '11111,,11111111111111111111111111111111111111111111111111111',
                '저 는 직장 인 입 니 다.저 는 직장 인 입 니 다.저 는 직장 인 입 니 다.',
                'Я из категории работающих. Я из категории работающих. Я из категории работающих. ',
                '33333,,33333333333333333333333333333333333333333333333333333',
                '一二三四五,,六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十',
                '哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈',
            ];
    
    //        header('Content-Type: text/html; charset=UTF-8');
            foreach ($titles as $title) {
                echo $this->cut_string($title, 10) . PHP_EOL;
            }
    
            die;
    
    
        }

    看一下效果

  • 相关阅读:
    非系统服务如何随系统启动时自动启动(rc.local加了可执行权限,仍然没有生效)
    centos7安装部署mysql5.7服务器
    centos7配置openldap服务器
    MySQL之高可用MHA部署
    root用户登录mysql后新建用户提示1045错误
    centos7上部署vnc服务器并实现远程桌面
    xenserver开启虚拟机时提示找不到存储介质,强制关闭和重启都没用
    固态硬盘和机械硬盘双硬盘安装win10,提示无法找到系统
    centos7安装的mysql无法启动(mysql daemon failed to start)
    实现在同一界面打开putty终端连接工具
  • 原文地址:https://www.cnblogs.com/qinwx/p/13948161.html
Copyright © 2011-2022 走看看