·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> php网站开发 >> php字符串截取问题

php字符串截取问题

作者:佚名      php网站开发编辑:admin      更新时间:2022-07-23
php字符串截取问题希望将一个字符串限长显示,如果该字符串超过一定长数,就截取前n个字符,后加省略号。但是在英文和汉字混合的情况下会出现如下问题:如果有这样一个字符串$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//村里有很多,这个是gb2312functionsubstrs($content,$length='30'){if($length&&strlen($content)>$length){$num=0;for($i=0;$i<$length-3;$i++){if(ord($content[$i])>127){$num++;}} //(脚本学堂 www.jbxue.com 编辑整理)$num%2==1?$content=substr($content,0,$length-4):$content=substr($content,0,$length-3);}return$content;}?>复制代码代码如下:functioncutstr($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;}复制代码代码如下:functioncutTitle($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];}}//(脚本学堂 www.jbxue.com 编辑整理) $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{ //(脚本学堂 www.jbxue.com 编辑整理)$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){//(脚本学堂 www.jbxue.com 编辑整理)$StringLast .= "...";}return $StringLast;}}$String = "www.baidu.com";$Length = "18";$Append = false;echo sysSubStr($String,$Length,$Append);?>