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 相关文章推荐
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
海河写的 Discuz论坛帖子调用js的php代码
Aug 23 PHP
利用static实现表格的颜色隔行显示的代码
Sep 02 PHP
PHP采集利器 Snoopy 试用心得
Jul 03 PHP
php中文验证码实现示例分享
Jan 12 PHP
thinkphp学习笔记之多表查询
Jul 28 PHP
php中cookie实现二级域名可访问操作的方法
Nov 11 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
PHP查找与搜索数组元素方法总结
Jun 12 PHP
PHP实现的文件操作类及文件下载功能示例
Dec 24 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 PHP
基于PHP实现短信验证码发送次数限制
Jul 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
一个很不错的PHP翻页类
2009/06/01 PHP
phpMyAdmin 安装配置方法和问题解决
2009/06/08 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
2012/07/17 PHP
PHP实现搜索时记住状态的方法示例
2018/05/11 PHP
javascript 同时在IE和FireFox获取KeyCode的代码
2010/02/07 Javascript
jQuery图片预加载 等比缩放实现代码
2011/10/04 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
iview Upload组件多个文件上传的示例代码
2018/09/30 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
Map与WeakMap类型在JavaScript中的使用详解
2020/11/18 Javascript
Python自定义线程池实现方法分析
2018/02/07 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
python一键去抖音视频水印工具
2018/09/14 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
对Python3 序列解包详解
2019/02/16 Python
python pytest进阶之fixture详解
2019/06/27 Python
python挖矿算力测试程序详解
2019/07/03 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
keras分类之二分类实例(Cat and dog)
2020/07/09 Python
详解python中GPU版本的opencv常用方法介绍
2020/07/24 Python
Pycharm安装第三方库失败解决方案
2020/11/17 Python
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
获奖的大学生创业计划书
2014/01/05 职场文书
十佳少年事迹材料
2014/12/25 职场文书
社区党务工作总结2015
2015/05/19 职场文书
《春酒》教学反思
2016/02/22 职场文书
2017春节晚会开幕词
2016/03/03 职场文书
redis 限制内存使用大小的实现
2021/05/08 Redis
Nginx缓存设置案例详解
2021/09/15 Servers
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL