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 相关文章推荐
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
Nov 14 PHP
php 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
PHP读取网页文件内容的实现代码(fopen,curl等)
Jun 23 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
Jun 13 PHP
屏蔽机器人从你的网站搜取email地址的php代码
Nov 14 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
Jan 17 PHP
简单实现限定phpmyadmin访问ip的方法
Mar 05 PHP
浅析php数据类型转换
Jan 09 PHP
php获取错误信息的方法
Jul 17 PHP
php+html5实现无刷新图片上传教程
Jan 22 PHP
php实现微信企业付款到个人零钱功能
Oct 09 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 26 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
php 高性能书写
2010/12/11 PHP
PHP中英混合字符串截取函数代码
2011/07/17 PHP
php实现发送微信模板消息的方法
2015/03/07 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
PHP中让json_encode不自动转义斜杠“/”的方法
2017/02/28 PHP
PHP的介绍以及优势详细分析
2019/09/05 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
vue实现简单loading进度条
2018/06/06 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
vue实现评论列表功能
2019/10/25 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
[13:56]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第一场
2018/04/06 DOTA
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
Python统计日志中每个IP出现次数的方法
2015/07/06 Python
详解python调度框架APScheduler使用
2017/03/28 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
PyQt QListWidget修改列表项item的行高方法
2019/06/20 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
Python3.6 中的pyinstaller安装和使用教程
2020/03/16 Python
通过自学python能找到工作吗
2020/06/21 Python
python3的pip路径在哪
2020/06/23 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
2016/07/08 HTML / CSS
纽约手袋品牌:KARA
2018/03/18 全球购物
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
电大自我鉴定
2013/10/27 职场文书
入党函调证明材料
2014/12/24 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书