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 相关文章推荐
复杂检索数据并分页显示的处理方法
Oct 09 PHP
PHP中用header图片地址 简单隐藏图片源地址
Apr 09 PHP
深入探讨PHP中的内存管理问题
Aug 31 PHP
PHP中“简单工厂模式”实例代码讲解
Sep 04 PHP
用C/C++扩展你的PHP 为你的php增加功能
Sep 06 PHP
php中判断文件存在是用file_exists还是is_file的整理
Sep 12 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
php根据分类合并数组的方法实例详解
Nov 06 PHP
PHP人民币金额转大写实例代码
Oct 02 PHP
PHP第三方登录―QQ登录实现方法
Feb 06 PHP
Laravel如何同时连接多个数据库详解
Aug 13 PHP
PHP调用接口API封装的例子
Oct 11 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
第十五节--Zend引擎的发展
2006/11/16 PHP
PHP简洁函数小结
2011/08/12 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
jquery.cvtooltip.js 基于jquery的气泡提示插件
2010/11/19 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
2017/02/23 Javascript
微信小程序 两种为对象属性赋值的方式详解
2017/02/23 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
python绘图库Matplotlib的安装
2014/07/03 Python
python分割文件的常用方法
2014/11/01 Python
Python动态加载模块的3种方法
2014/11/22 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
详解Python 函数如何重载?
2019/04/23 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
纯CSS3实现移动端展开和收起效果的示例代码
2020/04/26 HTML / CSS
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
如何将字串String转换成整数int
2015/02/21 面试题
Linux开机引导的步骤是什么
2015/10/19 面试题
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
活动总结怎么写
2014/04/28 职场文书
项目经理任命书
2014/06/04 职场文书
营业员岗位职责范本
2015/04/14 职场文书
结婚典礼主持词
2015/06/29 职场文书