下面的代码 自己亲自试的 有大用 中文算一个字符,英文也是算一个字符
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;
}
$string = '第一次截取,mb_substr返回的是字符串宽度是按“字”来计算';
echo substr_utf8($string,0,1).'<br/>';
echo substr_utf8($string,0,2).'<br/>';
echo substr_utf8($string,0,3).'<br/>';
echo substr_utf8($string,0,4).'<br/>';
echo substr_utf8($string,0,5).'<br/>';
echo substr_utf8($string,0,6).'<br/>';
echo substr_utf8($string,0,7).'<br/>';
echo substr_utf8($string,0,8).'<br/>';
echo substr_utf8($string,0,9).'<br/>';
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/>";
下面是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截取字符串应该是一个非常常见的字符串基础操作了,想必大家都比较熟悉这方面知识点。
但是有些新手朋友们可能遇到过,当截取中英文字符串时出现乱码的情况,其实这个也是非常容易解决的。
首先我们要了解关于中英文占多少字节的问题。
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
提到中英文混排计数、截取,大家首先想到的是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
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
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' );
?>
|
结果显示: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' );
?>
|
结果显示:24
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
PHP封装curl的调用接口及常用函数的介绍
PHP取整函数:ceil,floor,round,intval的区别介绍
以上就是php处理中文字符串截取(mb_substr)和获取中文字符串字数的介绍的详细内容,更多请关注php中文网其它相关文章!
来自 https://www.php.cn/php-weizijiaocheng-405782.html
php中计算中文字符串长度、截取中文字符串
2018年08月13日 18:12:37 xfxf996 阅读数 1494 原文地址为:
php中计算中文字符串长度、截取中文字符串在做PHP开发的时候,由于我国的语言环境问题,所以我们常常需要对中文进行处理。在PHP中,我们都知道有专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数并非PHP的核心函数,所以,它们常常有可能没有开启。当然,如果是用的自己的服务器,则只要在php.ini中开启即可。如果是用的虚拟主机,而服务器又没有开启这方面的函数的话,那就需要我们自己写出点适合咱国情的函数来了。
以下几个函数用起来颇为顺手的。不过要知道,得在utf-8环境下使用。
header('Content-type:text/html;charset=utf-8');
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);
支持gb2312,gbk,utf-8,big5 中文截取方法
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