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脚本的10个技巧(2)
Oct 09 PHP
通过PHP CLI实现简单的数据库实时监控调度
Jul 01 PHP
php中fsockopen用法实例
Jan 05 PHP
一张表搞清楚php is_null、empty、isset的区别
Jul 07 PHP
php实现图片缩略图的方法
Mar 29 PHP
PHP实现冒泡排序的简单实例
May 26 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
Dec 15 PHP
thinkphp修改配置进入默认首页的方法
Feb 07 PHP
PHP设计模式之工厂模式详解
Oct 24 PHP
python进程与线程小结实例分析
Nov 11 PHP
在Laravel的Model层做数据缓存的实现
Sep 26 PHP
Laravel Reponse响应客户端示例详解
Sep 03 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
PHP如何透过ODBC来存取数据库
2006/10/09 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
日期 时间js控件
2009/05/07 Javascript
Jquery选择器 $实现原理
2009/12/02 Javascript
基于jQuery的公告无限循环滚动实现代码
2012/05/11 Javascript
textarea 控制输入字符字节数(示例代码)
2013/12/27 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
jquery.validate 自定义验证方法及validate相关参数
2016/01/18 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
AngularJS ng-style中使用filter
2016/09/21 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
Node.js使用MySQL连接池的方法实例
2018/02/11 Javascript
详解封装基础的angular4的request请求方法
2018/06/05 Javascript
Vue一次性简洁明了引入所有公共组件的方法
2018/11/28 Javascript
python字典多条件排序方法实例
2014/06/30 Python
python 除法保留两位小数点的方法
2018/07/16 Python
python 将print输出的内容保存到txt文件中
2018/07/17 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
Jupyter notebook如何修改平台字体
2020/05/13 Python
django下创建多个app并设置urls方法
2020/08/02 Python
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
施华洛世奇英国官网:SWAROVSKI英国
2017/03/13 全球购物
语文教学随笔感言
2014/02/18 职场文书
小学社会实践活动总结
2014/07/03 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
教师党员整改措施
2014/10/24 职场文书
专家推荐信怎么写
2015/03/25 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
校园运动会广播稿
2015/08/19 职场文书
婚庆答谢词大全
2015/09/29 职场文书
话题作文之呼唤
2019/12/18 职场文书
Apache Calcite 实现方言转换的代码
2021/04/24 Servers
Python打包为exe详细教程
2021/05/18 Python
Python如何使用循环结构和分支结构
2022/04/13 Python