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创建多级目录代码
Jun 05 PHP
php导出CSV抽象类实例
Sep 24 PHP
php采用curl模仿登录人人网发布动态的方法
Nov 07 PHP
thinkPHP实现表单自动验证
Dec 24 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
Aug 23 PHP
PHP中使用array函数新建一个数组
Nov 19 PHP
PHP使用PDO操作数据库的乱码问题解决方法
Apr 08 PHP
PHP类和对象相关系统函数与运算符小结
Sep 28 PHP
PHP提取字符串中的手机号正则表达式怎么写
Jul 17 PHP
PHP的PDO大对象(LOBs)
Jan 27 PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 PHP
PHP如何开启Opcache功能提升程序处理效率
Apr 27 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树型类实例
2014/12/05 PHP
php post大量数据时发现数据丢失问题解决方法
2015/06/20 PHP
php上传大文件失败的原因及应对策略
2015/10/20 PHP
PHP6新特性分析
2016/03/03 PHP
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
laravel 判断查询数据库返回值的例子
2019/10/11 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
老生常谈javascript变量的命名规范和注释
2016/09/29 Javascript
基于Javascript实现文件实时加载进度的方法
2016/10/12 Javascript
微信小程序实现实时圆形进度条的方法示例
2017/02/24 Javascript
javascript帧动画(实例讲解)
2017/09/02 Javascript
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
javascript中的隐式调用
2018/02/10 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
详解Element 指令clickoutside源码分析
2019/02/15 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
2020/08/06 Javascript
Javascript中window.name属性详解
2020/11/19 Javascript
[00:56]跨越时空加入战场 全新祈求者身心“失落奇艺侍祭”展示
2019/07/20 DOTA
Python中函数的参数定义和可变参数用法实例分析
2015/06/04 Python
Django中url的反向查询的方法
2018/03/14 Python
python NumPy ndarray二维数组 按照行列求平均实例
2019/11/26 Python
Django 404、500页面全局配置知识点详解
2020/03/10 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
入党积极分子思想汇报
2014/01/02 职场文书
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
创先争优宣传标语
2014/10/08 职场文书
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android