首页 » 后端 » PHP » 正文

php 中文字符串截取函数 cutStr()

发布者:站点默认
2011/08/23 浏览数(2,978) 分类:PHP php 中文字符串截取函数 cutStr()已关闭评论

说明:
基于PHP的用于截取文章内容的UTF-8版字符串截取函数,自动添加省略号、过滤HTML标签。

代码:


/**
 *    说明:字符串截取函数(大写字母算一个,英文及其标点算半个)
 *    作者:upall,http://upall.cn/
 *    日期:9:25 2010年8月12日星期四
 *
 *    ( STRING ) $sourcestr	// 要截取的字符串
 *    ( INT ) $start 		// 开始截取的位置
 *    ( INT ) $cutlength	// 截取长度
 *    ( BOOL | STRING ) $tail		// 是否在末尾加上尾巴(默认是省略号(3个点)
 *    ( BOOL) $stripTags		// 是否在是否在截取前过滤HTML标签
 */
function cutStr($sourcestr = '', $start = 0,  $cutlength= 0, $tail = TRUE, $stripTags = TRUE) {
	if ($stripTags) $sourcestr = strip_tags($sourcestr);
	$returnstr = '';
	$i = 0; // 已经读取的字节数
	$n = 0; // 已经保留的字符数
	$s = 0; // 开始位置前的字节数
	$l = 0; // 开始位置前的字符数
	$begin = FALSE; // 开始截取前的长度是否够
	$str_length = strlen($sourcestr); //字符串的总字节数
	// 处理接收的数据
	$sourcestr = (string)$sourcestr;
	$start = (int)abs($start);
	$cutlength = (int)abs($cutlength);
	while ($n < $cutlength) { // 长度是否需要截?是否够长(开始位置前的长度+已截取的长度)?
		// 记下开始位置的字节数
		if (FALSE == $begin) {
			if( $start == $l ){ // 是否到了该截取的开始位置
				$begin = TRUE;
				$s = $i; // 记下开始字节位置
				$preStrLen = $s; // 记下开始截前的字节
			}
			$temp_str = substr($sourcestr, $i, 1); // UTF-8编码的字符可能由1~3个字节组成,具体数目可以由第一个字节判断出来。
			$ascnum = Ord($temp_str); // 得到字符串中第$i位字符的ascii码
			if ($ascnum >= 224) { // 如果ASCII位高与224,
				$i = $i +3; // 实际Byte计为3
				$l++; // 字符串长度加壹
			}elseif ($ascnum >= 192) { // 如果ASCII位高与192,
				$i = $i +2; // 实际Byte计为2
				$l++;
			}elseif ($ascnum >= 65 && $ascnum <= 90) { // 如果是大写字母,
				$i = $i +1; // 实际的Byte数仍计1个
				$l++;
			} else { // 其他情况下,包括小写字母和半角标点符号,
				$i = $i +1; // 实际的Byte数计1个
				$l++;
			}
		}
		// 开始截取,(条件:已到开始截取的位置,并且截取的字符长度还不够)
		while(TRUE == $begin && $cutlength > $n) {
			$temp_str = substr($sourcestr, $s, 1);
			$ascnum = Ord($temp_str); //得到字符串中第$i位字符的ascii码
			if ($ascnum >= 224) { //如果ASCII位高与224,
				$returnstr = $returnstr . substr($sourcestr, $s, 3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
				$s = $s +3; //实际Byte计为3
				$n++; //字串长度计1
			}else if ($ascnum >= 192) { //如果ASCII位高与192,
				$returnstr = $returnstr . substr($sourcestr, $s, 2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
				$s = $s +2; //实际Byte计为2
				$n++; //字串长度计1
			}
			else if ($ascnum >= 65 && $ascnum <= 90) { //如果是大写字母,
				$returnstr = $returnstr . substr($sourcestr, $s, 1);
				$s = $s +1; //实际的Byte数仍计1个
				$n++; //但考虑整体美观,大写字母计成一个高位字符(增强版函数,不考虑美观,直接算一个)
			} else { //其他情况下,包括小写字母和半角标点符号,
				$returnstr = $returnstr . substr($sourcestr, $s, 1);
				$s = $s +1; //实际的Byte数计1个
				$n++; // 字母和半角标点也算一个字
			}
		}
	}
	if (!empty($tail) && FALSE != $tail) { // 在末尾加上省略号
		if (TRUE === $tail){
			$tail = '...';
		}else{
			$tail = (string)$tail;
		}
		$cutlength = strlen($returnstr) + $preStrLen; // 截取长度 = 截取部分的长度 + 开头文字的长度
		if (0 < $start){
			$preTail = $tail;
			$returnstr = $preTail . $returnstr;
		}
		if ($cutlength < $str_length) {
			$returnstr = $returnstr . $tail; //超过长度时在尾处加上省略号
		}
	}
	return $returnstr;
}

<完>

点击返回顶部
  1. 留言
  2. 联系方式