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 相关文章推荐
PHP4引用文件语句的对比
Oct 09 PHP
php checkdate、getdate等日期时间函数操作详解
Mar 11 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
Jun 24 PHP
php实现的支持断点续传的文件下载类
Sep 23 PHP
php中spl_autoload详解
Oct 17 PHP
替换php字符串中的单引号为双引号的方法
Feb 16 PHP
浅谈php中变量的数据类型判断函数
Mar 04 PHP
PHP不使用内置函数实现字符串转整型的方法示例
Jul 03 PHP
PHP使用DOM对XML解析处理操作示例
Jul 04 PHP
在 Laravel 中动态隐藏 API 字段的方法
Oct 25 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
Sep 15 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发送AT指令实例代码
2016/05/26 PHP
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
javascript常见操作汇总
2014/09/03 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
js实现简易聊天对话框
2017/08/17 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
JS原生瀑布流效果实现
2019/04/26 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
Python3.x和Python2.x的区别介绍
2013/02/12 Python
Python的函数的一些高阶特性
2015/04/27 Python
Python实现telnet服务器的方法
2015/07/10 Python
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
Python使用pip安装pySerial串口通讯模块
2018/04/20 Python
Centos下实现安装Python3.6和Python2共存
2018/08/15 Python
python 利用已有Ner模型进行数据清洗合并代码
2019/12/24 Python
python爬虫中PhantomJS加载页面的实例方法
2020/11/12 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
什么是唯一索引
2015/07/05 面试题
人力资源部培训专员岗位职责
2014/01/02 职场文书
经贸韩语专业大学生职业规划
2014/02/14 职场文书
售前工程师职业生涯规划
2014/03/02 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
PyTorch 如何自动计算梯度
2021/05/23 Python
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android
Win11应用商店打开闪退怎么解决? win11应用商店打不开的多种解决办法
2022/04/05 数码科技
Windows 64位 安装 mysql 8.0.28 图文教程
2022/04/19 MySQL
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python
python playwright之元素定位示例详解
2022/07/23 Python