PHP 截取字符串专题集合


Posted in PHP onAugust 19, 2010

1、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'); 
?>

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、截取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; 
} 
?>

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()) 
* 
* @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 = "https://3water.com — 简单、精彩、通用"; 
$Length = "18"; 
$Append = false; 
echo sysSubStr($String,$Length,$Append); 
?>

dedecms中的截取代码
这是从dedecms直接拿的代码,大家可以稍作修改即可。
//中文截取2,单字节截取模式 
//如果是request的内容,必须使用这个函数 
function cn_substrR($str,$slen,$startdd=0) 
{ 
$str = cn_substr(stripslashes($str),$slen,$startdd); 
return addslashes($str); 
} 
//中文截取2,单字节截取模式 
function cn_substr($str,$slen,$startdd=0) 
{ 
global $cfg_soft_lang; 
if($cfg_soft_lang=='utf-8') 
{ 
return cn_substr_utf8($str,$slen,$startdd); 
} 
$restr = ''; 
$c = ''; 
$str_len = strlen($str); 
if($str_len < $startdd+1) 
{ 
return ''; 
} 
if($str_len < $startdd + $slen || $slen==0) 
{ 
$slen = $str_len - $startdd; 
} 
$enddd = $startdd + $slen - 1; 
for($i=0;$i<$str_len;$i++) 
{ 
if($startdd==0) 
{ 
$restr .= $c; 
} 
else if($i > $startdd) 
{ 
$restr .= $c; 
} 
if(ord($str[$i])>0x80) 
{ 
if($str_len>$i+1) 
{ 
$c = $str[$i].$str[$i+1]; 
} 
$i++; 
} 
else 
{ 
$c = $str[$i]; 
} 
if($i >= $enddd) 
{ 
if(strlen($restr)+strlen($c)>$slen) 
{ 
break; 
} 
else 
{ 
$restr .= $c; 
break; 
} 
} 
} 
return $restr; 
} 
//utf-8中文截取,单字节截取模式 
function cn_substr_utf8($str, $length, $start=0) 
{ 
if(strlen($str) < $start+1) 
{ 
return ''; 
} 
preg_match_all("/./su", $str, $ar); 
$str = ''; 
$tstr = ''; 
//为了兼容mysql4.1以下版本,与数据库varchar一致,这里使用按字节截取 
for($i=0; isset($ar[0][$i]); $i++) 
{ 
if(strlen($tstr) < $start) 
{ 
$tstr .= $ar[0][$i]; 
} 
else 
{ 
if(strlen($str) < $length + strlen($ar[0][$i]) ) 
{ 
$str .= $ar[0][$i]; 
} 
else 
{ 
break; 
} 
} 
} 
return $str; 
}

phpcms中的字符串截取代码:
function str_cut($string, $length, $dot = '...') 
{ 
$strlen = strlen($string); 
if($strlen <= $length) return $string; 
$string = str_replace(array(' ', '&', '"', ''', '“', '”', '—', '<', '>', '·', '…'), array(' ', '&', '"', "'", '“', '”', '—', '<', '>', '·', '…'), $string); 
$strcut = ''; 
if(strtolower(CHARSET) == 'utf-8') 
{ 
$n = $tn = $noc = 0; 
while($n < $strlen) 
{ 
$t = ord($string[$n]); 
if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) { 
$tn = 1; $n++; $noc++; 
} elseif(194 <= $t && $t <= 223) { 
$tn = 2; $n += 2; $noc += 2; 
} elseif(224 <= $t && $t < 239) { 
$tn = 3; $n += 3; $noc += 2; 
} elseif(240 <= $t && $t <= 247) { 
$tn = 4; $n += 4; $noc += 2; 
} elseif(248 <= $t && $t <= 251) { 
$tn = 5; $n += 5; $noc += 2; 
} elseif($t == 252 || $t == 253) { 
$tn = 6; $n += 6; $noc += 2; 
} else { 
$n++; 
} 
if($noc >= $length) break; 
} 
if($noc > $length) $n -= $tn; 
$strcut = substr($string, 0, $n); 
} 
else 
{ 
$dotlen = strlen($dot); 
$maxi = $length - $dotlen - 1; 
for($i = 0; $i < $maxi; $i++) 
{ 
$strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i]; 
} 
} 
$strcut = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $strcut); 
return $strcut.$dot; 
}
PHP 相关文章推荐
不用iconv库的gb2312与utf-8的互换函数
Oct 09 PHP
PHP开发入门教程之面向对象
Dec 05 PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
Jul 28 PHP
ajax php传递和接收变量实现思路及代码
Dec 19 PHP
php ctype函数中文翻译和示例
Mar 21 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
Jun 19 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
详解PHP中的mb_detect_encoding函数使用方法
Aug 18 PHP
php的PDO事务处理机制实例分析
Feb 16 PHP
PHP实现腾讯与百度坐标转换
Aug 05 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
php 过滤器实现代码
Aug 09 #PHP
PHP对字符串的递增运算分析
Aug 08 #PHP
PHP原理之异常机制深入分析
Aug 08 #PHP
php include加载文件两种方式效率比较
Aug 08 #PHP
将一维或多维的数组连接成一个字符串的php代码
Aug 08 #PHP
php简单提示框alert封装函数
Aug 08 #PHP
php递归实现无限分类生成下拉列表的函数
Aug 08 #PHP
You might like
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
php实现的漂亮分页方法
2014/04/17 PHP
PHP callback函数使用方法和注意事项
2015/01/23 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
2020/10/30 PHP
dojo 之基础篇
2007/03/24 Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
javascript json2 使用方法
2010/03/16 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
ES6记录异步函数的执行时间详解
2016/08/31 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
使用JavaScript实现表格编辑器(实例讲解)
2017/08/02 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
2018/02/22 Javascript
react中fetch之cors跨域请求的实现方法
2018/03/14 Javascript
微信小程序 JS动态修改样式的实现方法
2018/12/16 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
python的numpy模块安装不成功简单解决方法总结
2017/12/23 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
2021/01/24 Python
俄罗斯商务邀请函
2014/01/26 职场文书
学期自我评价
2014/01/27 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
幼儿园教师师德表现自我评价
2015/03/05 职场文书
特种设备安全管理制度
2015/08/06 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
导游词之河北邯郸
2019/09/12 职场文书
Java Optional<Foo>转换成List<Bar>的实例方法
2021/06/20 Java/Android