BILIBIBI

PHP以效果为目的处理文本断行

众所周知,在表格中可以使用word-wrap:break-word;来让长短文本强制性换行,但是在某些浏览器下如果一整行文本都是一串数字或者字母的话是不会换行的
所以为了各浏览器显示效果的统一有必要在后端将文本处理好之后再输出

PHP提供了一个函数叫wordwrap,官方手册里描述如下:

string wordwrap ( string $str [, int $width = 75 [, string $break = "\n" [, bool $cut = false ]]] )
使用字符串断点将字符串打断为指定数量的字串。

但是这个函数不支持UTF-8的字符串,如果字符串中带有中文的话会有几率导致将汉字一分为二变成乱码
而且就算使用mbstring来处理的话可以避免乱码,但是汉字和英文数字的宽度是不同的,一个汉字差不多有两个字母的宽度

所以需要判断字符是否为中文字符

function wordwrap_plus($str,$length = 25,$break = '<br />'){
    $words = preg_split('/(?<!^)(?!$)/u', $str);
    $i = 0;
    $return = '';
    foreach($words as $word){
        $i += strlen($word) > 1 ? 2 : 1;
        if($i > $length){
            $return .= $break;
            $i = 0;
        }
        $return .= $word;
    }
    return $return;
}

标签: none

已有 6 条评论

  1. 话说,php utf-8中文占三个字节位置,iconv转成gbk,gb2312可以用你这个
    顺带说句你这个博客名字在标签页上真是好容易忽悠人啊

    1. 但是就算是UTF-8,中文显示的时候也是占两个字符位置啊

    2. 容易看成bilibili,一开始我也看错了

  2. 新年快乐!
    (我好像来晚了

添加新评论