欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

php 截取中英文都算一个字符(也有不算一个的 这里是大杂烩) 有大用 有大大用

shiping1 的头像

下面的代码 自己亲自试的 有大用  中文算一个字符,英文也是算一个字符

function csubstr($str, $start=0, $length, $charset="utf-8", $suffix='')
{
    if(function_exists("mb_substr"))
    {
        if(mb_strlen($str, $charset) <= $length) return $str;
        $slice = mb_substr($str, $start, $length, $charset);
    }
    else
    {
        $re['utf-8']   = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
        $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
        $re['gbk']          = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
        $re['big5']          = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
        preg_match_all($re[$charset], $str, $match);
        if(count($match[0]) <= $length) return $str;
        $slice = join("",array_slice($match[0], $start, $length));
    }
    if($suffix) return $slice.$suffix;
    return $slice;

}




/*utf8编码时截取等长中英文字串*/ //英文标点[.,\"\\?!:_']

php 截取中英文都算一个字符  (下面代码 只能用在utf-8上)
<?
function substr_utf8($string,$start,$length)
{       //by aiou
     $chars = $string;
     //echo $string[0].$string[1].$string[2];
     $i=0;
     do{
         if (preg_match ("/[0-9a-zA-Z]/", $chars[$i])){//纯英文
             $m++;
         }
    else {$n++;         }//非英文字节,
         $k = $n/3+$m/2;
         $l = $n/3+$m;//最终截取长度;$l = $n/3+$m*2?
        $i++;
    } while($k < $length);
     $str1 = mb_substr($string,$start,$l,'utf-8');//保证不会出现乱码
     return $str1;
}

  1. $string = '第一次截取,mb_substr返回的是字符串宽度是按“字”来计算'

  1. echo substr_utf8($string,0,1).'<br/>';  

  2. echo substr_utf8($string,0,2).'<br/>';  

  3. echo substr_utf8($string,0,3).'<br/>';  

  4. echo substr_utf8($string,0,4).'<br/>';  

  5. echo substr_utf8($string,0,5).'<br/>';  

  6. echo substr_utf8($string,0,6).'<br/>';  

  7. echo substr_utf8($string,0,7).'<br/>';  

  8. echo substr_utf8($string,0,8).'<br/>';  

  9. echo substr_utf8($string,0,9).'<br/>';  

  10. echo substr_utf8($string,0,10).'<br/>'
    输出结果

    第一
    第一次
    第一次截
    第一次截取
    第一次截取,
    第一次截取,mb
    第一次截取,mb_s
    第一次截取,mb_sub
    第一次截取,mb_subst

 

 

下面的代码是中文算一个 英文算一个

/*
 
* 中文截取,支持gb2312,gbk,utf-8,big5
 
*
 
* @param string $str 要截取的字串
 
* @param int $start 截取起始位置
 
* @param int $length 截取长度
 
* @param string $charset utf-8|gb2312|gbk|big5 编码
 
* @param $suffix 是否加尾缀
 
*/
 
 function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)
 
{
 
   if(function_exists("mb_substr"))
 
   {
 
       if(mb_strlen($str, $charset) <= $length) return $str;
 
       $slice = mb_substr($str, $start, $length, $charset);
 
   }
 
   else
 
   {
 
       $re['utf-8']   = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
 
       $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
 
       $re['gbk']          = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
 
       $re['big5']          = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
 
       preg_match_all($re[$charset], $str, $match);
 
       if(count($match[0]) <= $length) return $str;
 
       $slice = join("",array_slice($match[0], $start, $length));
 
   }
 
   if($suffix) return $slice."…";
 
   return $slice;
 
}

$str="人人abc人人";
echo csubstr($str,0,2,'GBK');

 

 

 

下面的代码是中文算一个 英文算两个

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
    {
        $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;
    }
}
echo cut_str("我们aaa中国",4,0)

 

 

下面是GBk的情况下 中文算两个 英文算一个 下面这个好像不行

function msubstr ($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;
}

$str = "我w们m是s松s和h人r";
echo msubstr($str,0,1);echo "<Br/>";
echo msubstr($str,0,2);echo "<Br/>";
echo msubstr($str,0,3);echo "<Br/>";
echo msubstr($str,0,4);echo "<Br/>";
echo msubstr($str,0,5);echo "<Br/>";
echo msubstr($str,0,6);echo "<Br/>";
echo msubstr($str,0,7);echo "<Br/>";
echo msubstr($str,0,8);echo "<Br/>";
echo msubstr($str,0,9);echo "<Br/>";
echo msubstr($str,0,10);echo "<Br/>";

image.png

 

下面是GBK的情况下 中文算两个 英文算一个

/*
**
* 字符串截取,中文字符按2个字符计算,同时支持GBK和UTF-8编码
* @param $string 要截取的字符串
* @param $length 要截取的字符数
* @param $append 添加到子串后的尾巴
* @return 返回截取后的字符串
*/
function substring($string, $length, $append = false) {
if ( $length <= 0 ) {
return '';
}
// 检测原始字符串是否为UTF-8编码
$is_utf8 = false;
$str1 = @iconv("UTF-8", "GBK", $string);
$str2 = @iconv("GBK", "UTF-8", $str1);
if ( $string == $str2 ) {
$is_utf8 = true;
// 如果是UTF-8编码,则使用GBK编码的
$string = $str1;
}
$newstr = '';
for ($i = 0; $i < $length; $i ++) {
$newstr .= ord ($string[$i]) > 127 ? $string[$i] . $string[++$i] : $string[$i];
}
if ( $is_utf8 ) {
$newstr = @iconv("GBK", "UTF-8", $newstr);
}
if ($append && $newstr != $string) {
$newstr .= $append;
}
return $newstr;
}
echo substring("我们aaa中国",5);

 

 

 

 

 

下面是GBk的情况下 中文算两个 英文算一个//中文截取2,单字节截取模式
function cn_substr($str,$slen,$startdd=0){
    $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<$str_len;$i++)
    {
        if($startdd==0) $restr .= $c;
        else if($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;
}

echo cn_substr("我们aaa中国",5,0);

 

下面是GBk的情况下 中文算两个 英文算一个//双字节处理函数
function str_sub2($c_Str,$c_Len,$vStr=" ...")
{
    if(strlen($c_Str)<=$c_Len)
    {
        return $c_Str;
    }
    $ls_Str="";
    $xi=0;
    while($xi<$c_Len)
    {
        $ls_Str.=$c_Str[$xi];
        if(ord($c_Str[$xi])>127)
        {
            $xi++;
            $ls_Str.=$c_Str[$xi];
        }
        $xi++;
    }
    return $ls_Str.$vStr;
}

echo str_sub2("我们aaa中国",2,'...');

 

下面是仅仅utf-8的情况下 中文算一个 英文算一个

/*
 * Created on 2013-7-3
 *
 * To change the template for this generated file go to
 * Window - Preferences - PHPeclipse - PHP - Code Templates
 * 注意这里的传参 第三个参数 不放在形参上 在里面 func_get_arg 这个函数里进行取
*/
 function utf8_substr($str,$start=0) {
    if(empty($str)){
        return false;
    }
    if (function_exists('mb_substr')){
        if(func_num_args() >= 3) {
            $end = func_get_arg(2);
            return mb_substr($str,$start,$end,'utf-8');
        }
        else {
            mb_internal_encoding("UTF-8");
            return mb_substr($str,$start);
        }      
 
    }
    else {
        $null = "";
        preg_match_all("/./u", $str, $ar);
        if(func_num_args() >= 3) {
            $end = func_get_arg(2);
            return join($null, array_slice($ar[0],$start,$end));
        }
        else {
            return join($null, array_slice($ar[0],$start));
        }
    }
}
$str2  = 'wo要截取zhongwen';
echo '<br />';
echo utf8_substr($str2,0,-4); //return wo要截取zhon
echo '<br />';
echo utf8_substr($str2,0,4); //return wo要截

 

来自于 http://www.cnblogs.com/wish123/archive/2011/08/09/2132150.html

它的例子特好

 

 

 

 

 

< ?
function cut($Str, $Length) {//$Str为截取字符串,$Length为需要截取的长度

global $s;
$i = 0;
$l = 0;
$ll = strlen($Str);
$s = $Str;
$f = true;

while ($i <= $ll) {
if (ord($Str{$i}) < 0x80) {
$l++; $i++;
} else if (ord($Str{$i}) < 0xe0) {
$l++; $i += 2;
} else if (ord($Str{$i}) < 0xf0) {
$l += 2; $i += 3;
} else if (ord($Str{$i}) < 0xf8) {
$l += 1; $i += 4;
} else if (ord($Str{$i}) < 0xfc) {
$l += 1; $i += 5;
} else if (ord($Str{$i}) < 0xfe) {
$l += 1; $i += 6;
}

if (($l >= $Length - 1) && $f) {
$s = substr($Str, 0, $i);
$f = false;
}

if (($l > $Length) && ($i < $ll)) {
$s = $s . '...'; break; //如果进行了截取,字符串末尾加省略符号“...”
}
}
return $s;
}
?>

 

 



/* 字符截取 , 截取指定offset前后各截取多少个字 , 用mb_substr */
function substr2($str , $needle , $frontLen , $endLen , $encoding='' , $mode='i' )
{
    if( $mode=='i' )
    {
        $string = strtolower( $str );
        $startstr = strtolower( $needle );
    }else {
        $string =  $str;
        $startstr =  $needle;        
    }
    if( $encoding !='' )
    {
        $midpos = mb_strpos( $string , $startstr , 0 , $encoding );
        if($midpos===false)    return false;
        if( $midpos<=$frontLen )
            $fpos = $midpos-$frontLen;
        else
            $fpos=0;
        
        //$epos = $midpos+mb_strlen($startstr , $encoding );
        $epos = $midpos; $endLen += mb_strlen($startstr , $encoding );
        $fstr = mb_substr($str, $fpos , $frontLen , $encoding );
        $estr = mb_substr($str, $epos , $endLen , $encoding );
        return $fstr.$estr;
    }else {
        $midpos = strpos( $string , $startstr );        
        if($midpos===false)    return false;
        if( $midpos<=$frontLen )
            $fpos = $midpos-$frontLen;
        else
            $fpos=0;
    
        $fpos = $midpos-$frontLen;
        //$epos = $midpos+strlen($startstr);
        $epos = $midpos; $endLen += strlen( $startstr );
        $fstr = substr($str, $fpos , $frontLen  );
        $estr = substr($str, $epos , $endLen  );
        return $fstr.$estr;        
    }
}

function msubstr($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;
}

 

 

    function  getCutStr($str,$len)
    {
        $content=trim(strip_tags($str));
        if( strLength($content,'gb2312')>$len){
        $content= CutString($content,$len,0,'GBK');
        }
        return $content;
    }

 

 

function CutString($_String, $_Length, $_Start=0, $_Encode='GBK')
{
    $v = 0;
    if($_Encode == '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, $_Rarray);
        $_SLength = count($_Rarray[0]);
        if($_SLength < $_Length) return $_String;
        for($i=$_Start; $i<$_SLength; $i++)
        {
            if($v >= $_Length * 2 - 1) return $_RS.'';
            if(ord($_Rarray[0][$i]) > 129) $v += 2;
            else $v++;
            $_RS .= $_Rarray[0][$i];
        }
    } else {
        $_Start = $_Start * 2;
        $_Length = $_Length * 2;
        $_Len = strlen($_String);
        if($_Len < $_Length) return $_String;
        $_Rstring= '';
        for($i=$_Start; $i<$_Len; $i++)
        {
            if($v >= $_Length - 1) return $_Rstring.'';
            if(ord(substr($_String, $i, 1)) > 129) { $_Rstring .= substr($_String, $i, 2); $v += 2; $i++; }
            else { $_Rstring .= substr($_String, $i, 1); $v++; }
        }
        return $_Rstring;
    }
}

 

 

    /**
     * @desc 截取中文函数
     * @author phpyj
     */
    function msubstr ($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;
    }
 

 

/**
 * 截断字符串
 *
 * @global string $db_charset
 * @param string $content 内容
 * @param int $length 截取字节数
 * @param string $add 是否带省略号,Y|N
 * @return string
 */
function substrs($content, $length, $add = 'Y') {
    if (strlen($content) > $length) {
        if ($GLOBALS['db_charset'] != 'utf-8') {
            $cutStr = '';
            for ($i = 0; $i < $length - 1; $i++) {
                $cutStr .= ord($content[$i]) > 127 ? $content[$i] . $content[++$i] : $content[$i];
            }
            $i < $length && ord($content[$i]) <= 127 && $cutStr .= $content[$i];
            return $cutStr . ($add == 'Y' ? ' ..' : '');
        }
        return utf8_trim(substr($content, 0, $length)) . ($add == 'Y' ? ' ..' : '');
    }
    return $content;
}
 



PHP实现中文字符串截取无乱码

复制代码
在我们学习PHP知识的过程中,PHP截取字符串应该是一个非常常见的字符串基础操作了,想必大家都比较熟悉这方面知识点。

但是有些新手朋友们可能遇到过,当截取中英文字符串时出现乱码的情况,其实这个也是非常容易解决的。

首先我们要了解关于中英文占多少字节的问题。

ASCII码:一个中文汉字占两个字节的空间。

UTF-8编码:一个中文(含繁体)等于三个字节。

Unicode编码:一个中文(含繁体)等于两个字节。

下面我们就通过几个简单的代码示例为大家详细介绍关于PHP截取中英字符串且无乱码的相关知识。

一、关于substr函数截取字符串

<?php

echo substr("PHP中文网", 0, 5);

substr:返回字符串的子串。

substr()中第一个参数表示要截取的字符串,第二个参数表示从0位置开始截取,第三个参数表示截取长度。

截取“PHP中文网”前5个字节,结果如下:

如图显示乱码,也就是说当我们使用substr函数进行中英文字符串截取时,会出现乱码。

二、关于mb_substr函数截取字符串

<?php

echo mb_substr("PHP中文网", 0, 5);

mb_substr:获取部分字符串。

截取“PHP中文网”前5个字符,结果如下:

如图截取了前五个字符,并且没有出现乱码。

注:mb_substr是根据字符数来执行截取字符串。

三、关于mb_strcut函数截取字符串

<?php

echo mb_strcut("PHP中文网", 0, 7);

截取“PHP中文网”前7个字节,结果如下:



从图中可以看到,我们要截取7个字节,但是只显示截取了“PHP中”这6个字节。由于一个汉字等于三个字节,那么这里第7个字节就不会显示了。

综上所述,如果大家遇到要截取中文字符串并无乱码的需求时,可以选择后两种方法(mb_substr()和mb_strcut())
复制代码

来自  https://www.cnblogs.com/sgm4231/p/9771496.html



php简简单单搞定中英文混排字符串截取,只需2行代码!

提到中英文混排计数、截取,大家首先想到的是ascii、16进制、正则匹配、循环计数。

今天我给大家分享的是php的mb扩展,教你如何轻松处理字符串。


 

先给大家介绍用到的函数:

mb_strwidth($str, $encoding) 返回字符串的宽度

$str 要计算的字符串

$encoding 要使用的编码,如 utf8、gbk

mb_strimwidth($str, $start, $width, $tail, $encoding) 按宽度截取字符串

$str 要截取的字符串

$start 从哪个位置开始截取,默认是0

$width 要截取的宽度

$tail 追加到截取字符串后边的字符串,常用的是 ...

$encoding 要使用的编码


 

下边给大家实例演示:

复制代码
<?php
/**
 * utf8 编码格式
 * 1个中文占用3个字节
 * 我们希望的是1个中文占用2个字节,
 * 因为从宽度上看2个英文字母占用的位置相当于1个中文
 */

// 测试字符串
$str = 'aaaa啊啊aaaa啊啊啊aaa';
echo strlen($str); // 只用strlen输出为25个字节

// 必须指定编码,不然会使用php的内码 mb_internal_encoding()可以查看内码
// 使用mb_strwidth输出字符串的宽度为20使用utf8编码
echo mb_strwidth($str, 'utf8'); 

// 只有宽度大于10才截取
if(mb_strwidth($str, 'utf8')>10){
    // 此处设定从0开始截取,取10个追加...,使用utf8编码
    // 注意追加的...也会被计算到长度之内
    $str = mb_strimwidth($str, 0, 10, '...', 'utf8');
}

// 最后输出 aaaa啊... 4个a算4个 1个啊算2个 3个点算3个 4+2+3=9
// 是不是很简单啊,有的人说了为什么是9个不是10个吗?
// 因为正好“啊”的后边还是“啊”,中文算2个,9+2=11 超出了设定,所以去掉1个就是9了
echo $str;
复制代码

 


 

下边再给大家介绍一些其它函数吧:

mb_strlen($str, $encoding) 返回字符串的长度

$str 要计算的字符串

$encoding 使用的编码

mb_substr($str, $start, $length, $encoding) 截取字符串

$str 要截取的字符串

$start 从哪里开始截取

$length 截取多长

$encoding 使用的编码

其实这2个函数和strlen()、substr()很像,唯一的不同就是可以设定编码。


 

下边上实例:

复制代码
<?php
/**
 * utf8 编码格式
 * 1个中文占用3个字节
 */
$str = 'aa12啊aa';
echo strlen($str); // 直接输出长度为9

// 输出长度为7,为什么是7呢?
// 注意这里设定编码以后,不管是中文还是英文每个长度都为1
// a a 1 2 啊 a a 
// 1+1+1+1+1+1+1 = 7
// 是不是正好7个字符啊
echo mb_strlen($str, 'utf8');

// 同样mb_substr也是一样的
// 我现在只想要5个字符
echo mb_substr($str, 0, 5, 'utf8'); // 输出 aa12啊
复制代码

 


 

其实mb扩展里边很有很多好用的函数,这里就不给大家一一列举。

有兴趣的朋友可以查看官方手册

http://www.php.net/manual/zh/ref.mbstring.php

好了,今天就先介绍到这里了。

 

来自 https://www.cnblogs.com/chenyanger/p/3755579.html



(实用篇)多个PHP中文字符串截取函数

字符串截取是一个非常常见的编程任务,而往往带中文的字符串截取会经常用到。虽然不难,但是自己写函数实现又耗费时间,这里介绍一个比较好用的字符串截取函数,能够胜任基本的需求了

复制代码
<?php
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) 
        { 
            $stringLast .= "..."; 
        } 
        return $stringLast; 
    } 
} 

$string = "简明现代魔法 —— 专注于互联网主流的各种技术"; 
$length = "27"; 
$append = true; 
echo sysSubStr($string,$length,$append); 
// 输出 
// 简明现代魔法 —— 专...
?>
复制代码

截取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;
}
?>
复制代码

截取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);
}
?>
复制代码

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 
    { 
        $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'); 
?>
复制代码

 


来自 https://www.cnblogs.com/zhangmiaomiao/p/6013395.html


php处理中文字符串截取(mb_substr)和获取中文字符串字数的介绍

原创2018-07-03 15:57:5502777

phpstudy集成环境下载

PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数,需要的朋友可以参考下。


一、中文截取:mb_substr()

mb_substr( $str, $start, $length, $encoding )

$str,需要截断的字符串 
$start,截断开始处,起始处为0 
$length,要截取的字数 
$encoding,网页编码,如utf-8,GB2312,GBK

实例:

1

2

3

4

<?php

$str='php中文网://www.php.cn';

echo mb_substr($str,0,4,'utf-8');//截取头5个字,假定此代码所在php文件的编码为utf-8

?>

结果显示:php中文网

二、获取中文长度:mb_strlen()

mb_strlen( $str, $encoding )

$str,要计算长度的字符串 
$encoding,网页编码,如utf-8,GB2312,GBK

实例:

1

2

3

4

<?php

$str='php中文网://www.php.cn';

echo mb_strlen($str,'utf-8');//假定此代码所在php文件的编码为utf-8

?>

结果显示:24 

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

PHP封装curl的调用接口及常用函数的介绍

PHP取整函数:ceil,floor,round,intval的区别介绍

以上就是php处理中文字符串截取(mb_substr)和获取中文字符串字数的介绍的详细内容,更多请关注php中文网其它相关文章!

来自  https://www.php.cn/php-weizijiaocheng-405782.html



php中计算中文字符串长度、截取中文字符串

原文地址为:php中计算中文字符串长度、截取中文字符串

在做PHP开发的时候,由于我国的语言环境问题,所以我们常常需要对中文进行处理。在PHP中,我们都知道有专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数并非PHP的核心函数,所以,它们常常有可能没有开启。当然,如果是用的自己的服务器,则只要在php.ini中开启即可。如果是用的虚拟主机,而服务器又没有开启这方面的函数的话,那就需要我们自己写出点适合咱国情的函数来了。

以下几个函数用起来颇为顺手的。不过要知道,得在utf-8环境下使用。

header('Content-type:text/html;charset=utf-8');
/**
* 可以统计中文字符串长度的函数
* @param $str 要计算长度的字符串
* @param $type 计算长度类型,0(默认)表示一个中文算一个字符,1表示一个中文算两个字符
*
*/
function abslength($str)
{
if(empty($str)){
return 0;
}
if(function_exists('mb_strlen')){
return mb_strlen($str,'utf-8');
}
else {
preg_match_all("/./u", $str, $ar);
return count($ar[0]);
}
}
$str = '我们都是中国人啊,ye!';
$len = abslength($str);
var_dump($len);  //return 12
$len = abslength($str,'1');
echo '<br />'.$len;  //return 22

/*
utf-8编码下截取中文字符串,参数可以参照substr函数
@param $str 要进行截取的字符串
@param $start 要进行截取的开始位置,负数为反向截取
@param $end 要进行截取的长度
*/
function utf8_substr($str,$start=0) {
if(empty($str)){
return false;
}
if (function_exists('mb_substr')){
if(func_num_args() >= 3) {
   $end = func_get_arg(2);
   return mb_substr($str,$start,$end,'utf-8');
}
else {
mb_internal_encoding("UTF-8");
return mb_substr($str,$start);
}

}
else {
$null = "";
preg_match_all("/./u", $str, $ar);
if(func_num_args() >= 3) {
   $end = func_get_arg(2);
   return join($null, array_slice($ar[0],$start,$end));
}
else {
   return join($null, array_slice($ar[0],$start));
}
}
}
$str2  = 'wo要截取zhongwen';
echo '<br />';
echo utf8_substr($str2,0,-4); //return wo要截取zhon

支持gb2312,gbk,utf-8,big5 中文截取方法

 /*  

* 中文截取,支持gb2312,gbk,utf-8,big5  

*  

* @param string $str 要截取的字串  

* @param int $start 截取起始位置  

* @param int $length 截取长度  

* @param string $charset utf-8|gb2312|gbk|big5 编码  

* @param $suffix 是否加尾缀  

*/

public function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)  

{  

   if(function_exists("mb_substr"))  

   {  

       if(mb_strlen($str, $charset) <= $length) return $str;  

       $slice = mb_substr($str, $start, $length, $charset);  

   }  

   else

   {  

       $re['utf-8']   = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";  

       $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";  

       $re['gbk']          = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";  

       $re['big5']          = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";  

       preg_match_all($re[$charset], $str, $match);  

       if(count($match[0]) <= $length) return $str;  

       $slice = join("",array_slice($match[0], $start, $length));  

   }  

   if($suffix) return $slice."…";  

   return $slice;  

}

转载请注明本文地址:php中计算中文字符串长度、截取中文字符串


来自  https://blog.csdn.net/xfxf996/article/details/81634620

普通分类: