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 相关文章推荐
Windows下的PHP5.0详解
Nov 18 PHP
ThinkPHP令牌验证实例
Jun 18 PHP
php提高网站效率的技巧
Sep 29 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
Feb 23 PHP
php实现图片缩略图的方法
Mar 29 PHP
php函数mkdir实现递归创建层级目录
Oct 27 PHP
PHP面向对象程序设计方法实例详解
Dec 24 PHP
php求数组全排列,元素所有组合的方法总结
Mar 14 PHP
php实现查询功能(数据访问)
May 23 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
Jul 20 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
Jun 25 PHP
PHP array_reverse() 函数原理及实例解析
Jul 14 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-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
php获取网页中图片、DIV内容的简单方法
2014/06/19 PHP
YII实现分页的方法
2014/07/09 PHP
php自动载入类用法实例分析
2016/06/24 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
简单谈谈 php 文件锁
2017/02/19 PHP
PHP7 弃用功能
2021/03/09 PHP
基于jquery实现控制经纬度显示地图与卫星
2013/05/20 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
js比较日期大小的方法
2015/05/12 Javascript
Node.js 数据加密传输浅析
2016/11/16 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
浅谈Node Inspector 代理实现
2017/10/19 Javascript
JavaScript模块详解
2017/12/18 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
通过实例解析js可枚举属性与不可枚举属性
2020/12/02 Javascript
JavaScript实现打字游戏
2021/02/19 Javascript
[47:53]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#2COL VS Spirit
2016/03/02 DOTA
[00:50]深扒TI7聊天轮盘语音出处6
2017/05/11 DOTA
[40:19]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.18
2020/12/19 DOTA
下载给定网页上图片的方法
2014/02/18 Python
Python下线程之间的共享和释放示例
2015/05/04 Python
Python爬虫实现(伪)球迷速成
2018/06/10 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
病媒生物防治方案
2014/05/13 职场文书
大型演出策划方案
2014/05/28 职场文书
护理专科学生自荐书
2014/07/05 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
新员工入职欢迎词
2015/01/23 职场文书
贫困生证明范文
2015/06/16 职场文书
Python开发五子棋小游戏
2022/04/28 Python