php字符串截取问题


Posted in PHP onNovember 28, 2006

但是在英文和汉字混合的情况下会出现如下问题:

如果有这样一个字符串
$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++; 
            } 
        } 
        $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]; 
                        } 
                } 
                $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 
{ 
$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) 
{ 
$StringLast .= "..."; 
} 
return $StringLast; 
} 
}$String = "www.baidu.com"; 
$Length = "18"; 
$Append = false; 
echo sysSubStr($String,$Length,$Append); 
?>
PHP 相关文章推荐
PHP的宝库目录--PEAR
Oct 09 PHP
实用函数8
Nov 08 PHP
在项目中寻找代码的坏命名
Jul 14 PHP
php使用curl存储cookie的示例
Mar 31 PHP
教你如何开启shopnc b2b2c 伪静态
Oct 21 PHP
php页面函数设置超时限制的方法
Dec 01 PHP
深入剖析PHP中printf()函数格式化使用
May 23 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
Jun 15 PHP
PHP 闭包详解及实例代码
Sep 28 PHP
phpStorm+XDebug+chrome 配置详解
Apr 01 PHP
Laravel如何同时连接多个数据库详解
Aug 13 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 PHP
mysq GBKl乱码
Nov 28 #PHP
php类
Nov 27 #PHP
PHP完整的日历类(CLASS)
Nov 27 #PHP
PHP如何得到当前页和上一页的地址?
Nov 27 #PHP
PHP读写文件的方法(生成HTML)
Nov 27 #PHP
PHP date函数参数详解
Nov 27 #PHP
PHP 应用程序的安全 -- 不能违反的四条安全规则
Nov 26 #PHP
You might like
Adodb的十个实例(清晰版)
2006/12/31 PHP
PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
与文件上传有关的php配置参数总结
2013/06/14 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
理解JavaScript中的对象 推荐
2011/01/09 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
vue select选择框数据变化监听方法
2018/08/24 Javascript
原生js检测页面加载完毕的实例
2018/09/11 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
2020/05/07 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
编写简单的Python程序来判断文本的语种
2015/04/07 Python
Python爬取附近餐馆信息代码示例
2017/12/09 Python
python 2.7 检测一个网页是否能正常访问的方法
2018/12/26 Python
Django网络框架之HelloDjango项目创建教程
2019/06/06 Python
python绘制直方图和密度图的实例
2019/07/08 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
Python多进程multiprocessing、进程池用法实例分析
2020/03/24 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
软件设计的目标是什么
2016/12/04 面试题
幼儿园春季开学寄语
2014/04/03 职场文书
合作协议书怎么写
2014/04/18 职场文书
《歌唱二小放牛郎》教学反思
2014/04/19 职场文书
教师节宣传方案
2014/05/23 职场文书
消防安全标语
2014/06/07 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python