• php字符串截取问题


    希望将一个字符串限长显示,如果该字符串超过一定长数,就截取前n个字符,后加省略号。 但是在英文和汉字混合的情况下会出现如下问题: 

    如果有这样一个字符串 
    $str="这是一个字符串"; 
    为了截取该串的前10个字符,使用 
    if(strlen($str)>10) $str=substr($str,10)."…"; 
    那么,echo $str的输出应该是"这是一个字…" 

    假设 
    $str="这是1个字符串"; 
    这个串中包含了一个半角字符,同样执行: 
    if(strlen($str)>10) $str=substr($str,10); 
    由于原字符串$str的第10、11个字符构成了汉字“符”; 
    执行串分割后会将该汉字一分为二,这样被截取的串就会发现乱码现象。 


    请问这种问题如何解决?即要使过长字符串实现分割,又不能让它发生乱码?
    复制代码代码如下:

    <?php 
    //村里有很多,这个是gb2312 
    function substrs($content,$length='30') 

        if($length && strlen($content)>$length) 
        { 
            $num=0; 
            for($i=0;$i<$length-3;$i++) 
            { 
                if(ord($content[$i])>127) 
                { 
                    $num++; 
                } 
            } //(脚本学堂 www.jbxue.com 编辑整理)
            $num%2==1 ? $content=substr($content,0,$length-4):$content=substr($content,0,$length-3); 
        } 
        return $content; 

    ?>
     
    复制代码代码如下:

    function cutstr($string, $length, $dot = ' ...') { 
            $strcut = ''; 
            for($i = 0; $i < $length - strlen($dot) - 1; $i++) { 
                    $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i]; 
            } 
            return $strcut.$dot; 
    }

    复制代码代码如下:

    function cutTitle($str, $len, $tail = ""){ 
            $length                = strlen($str); 
            $lentail        = strlen($tail); 
            $result                = ""; 
            if($length > $len){ 
            $len = $len - $lentail; 
                    for($i = 0;$i < $len;$i ++){ 
                            if(ord($str[$i]) < 127){ 
                                    $result .= $str[$i]; 
                            }else{ 
                                    $result .= $str[$i]; 
                                    ++ $i; 
                                    $result .= $str[$i]; 
                            } 
                    } //(脚本学堂 www.jbxue.com 编辑整理)
                     $result = strlen($result) > $len ? substr($result, 0, -2) . $tail : $result . $tail; 
            }else{ 
                    $result = $str; 
            } 
            return $result; 
    }

    以下是一些补充:
    1. 截取GB2312中文字符串 
    代码如下: 
    复制代码代码如下:
    <?php 
    //截取中文字符串 
    function mysubstr($str, $start, $len) { 
    $tmpstr = ""; 
    $strlen = $start + $len; 
    for($i = 0; $i < $strlen; $i++) { 
    if(ord(substr($str, $i, 1)) > 0xa0) { 
    $tmpstr .= substr($str, $i, 2); 
    $i++; 
    } else 
    $tmpstr .= substr($str, $i, 1); 

    return $tmpstr; 

    ?> 

    2. 截取utf8编码的多字节字符串 
    代码如下: 
    复制代码代码如下:

    <?php 
    //截取utf8字符串 
    function utf8Substr($str, $from, $len) 

    return preg_replace('#^(?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,'.$from.'}'. 
    '((?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,'.$len.'}).*#s', 
    '$1',$str); 

    ?> 

    3. UTF-8、GB2312都支持的汉字截取函数 
    代码如下: 
    复制代码代码如下:

    <?php 
    /* 
    Utf-8、gb2312都支持的汉字截取函数 
    cut_str(字符串, 截取长度, 开始长度, 编码); 
    编码默认为 utf-8 
    开始长度默认为 0 
    */function cut_str($string, $sublen, $start = 0, $code = 'UTF-8') 

    if($code == 'UTF-8') 

    $pa ="/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/"; 
    preg_match_all($pa, $string, $t_string); if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen))."..."; 
    return join('', array_slice($t_string[0], $start, $sublen)); 

    else 
    {  //(脚本学堂 www.jbxue.com 编辑整理)
     $start = $start*2; 
    $sublen = $sublen*2; 
    $strlen = strlen($string); 
    $tmpstr = ''; for($i=0; $i<$strlen; $i++) 

    if($i>=$start && $i<($start+$sublen)) 

    if(ord(substr($string, $i, 1))>129) 

    $tmpstr.= substr($string, $i, 2); 

    else 

    $tmpstr.= substr($string, $i, 1); 


    if(ord(substr($string, $i, 1))>129) $i++; 

    if(strlen($tmpstr)<$strlen ) $tmpstr.= "..."; 
    return $tmpstr; 

    }$str = "abcd需要截取的字符串"; 
    echo cut_str($str, 8, 0, 'gb2312'); 
    ?> 

    4. BugFree 的字符截取函数 
    代码如下: 
    复制代码代码如下:

    <?php 
    /** 
    * @package BugFree 
    * @version $Id: FunctionsMain.inc.php,v 1.32 2005/09/24 11:38:37 wwccss Exp $ 


    * Return part of a string(Enhance the function substr()) 

    * @author Chunsheng Wang 
    * @param string $String the string to cut. 
    * @param int $Length the length of returned string. 
    * @param booble $Append whether append "...": false|true 
    * @return string the cutted string. 
    */ 
    function sysSubStr($String,$Length,$Append = false) 

    if (strlen($String) <= $Length ) 

    return $String; 

    else 

    $I = 0; 
    while ($I < $Length) 

    $StringTMP = substr($String,$I,1); 
    if ( ord($StringTMP) >=224 ) 

    $StringTMP = substr($String,$I,3); 
    $I = $I + 3; 

    elseif( ord($StringTMP) >=192 ) 

    $StringTMP = substr($String,$I,2); 
    $I = $I + 2; 

    else 

    $I = $I + 1; 

    $StringLast[] = $StringTMP; 

    $StringLast = implode("",$StringLast); 
    if($Append) 
    { //(脚本学堂 www.jbxue.com 编辑整理)
     $StringLast .= "..."; 

    return $StringLast; 

    }$String = "www.baidu.com"; 
    $Length = "18"; 
    $Append = false; 
    echo sysSubStr($String,$Length,$Append); 
    ?> 
  • 相关阅读:
    高并发量网站解决方案
    多服务器之间Session共享
    Mysql性能优化
    PHP memcache的使用教程
    select * 为什么不好? limit 1 为什么好? --mysql SQL语句优化
    八大排序对比
    /var/spool/postfix/maildrop 出现大量文件原因和解决办法
    sql根据某一个字段重复只取第一条数据
    postgreSQL 自增需要使用序列
    MySQL锁定状态查看相关命令
  • 原文地址:https://www.cnblogs.com/linuxnotes/p/3604392.html
Copyright © 2020-2023  润新知