说明:
基于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;
}
<完>