php中几个截取字符串函数
2009-06-27 15:03:59 作者:allniu 来源:www.allniu.com 浏览次数:0 网友评论 0 条
/*****************************(一)**********************/
/**
* 截取字符串函数.
* @author allniu
* @param string $str 要截取的字符串
* @param int $len 截取字符串的长度
* @param int $padstr 代替字符串
* @return string
*/
function subcnstr($str, $len, $padstr="…")
{
$ret="";
if ( strlen($str)<=$len )
{ return $str;
}
$len=$len-strlen($padstr);
for($i=0; $i<$len; $i++)
{ $ret.=$str[$i];
if (ord($str[$i])>128)
{ $i++;
$ret.=$str[$i];
}
}
$ret.=$padstr;
return $ret;
}
/********************************(二)****************************/
/**
* @Description :cutSubstr 截取字符串
* @param $string (字符串 字符串类型)
* @param $start (开始截取位置 整型)
* @param $length (截取长度 整型)
* @return String (返回字符串)
*/
static function cutSubstr($string,$start=0,$length=0,$tail='')
{
$l = $length;
if($l == 0)$l = strlen($string);
if($start< 0 || $l < 0)
{
return $string;
}
if(($start+$l) >= strlen($string))
{
return substr($string,$start,$l);
}
else
{
$j=0;
$num=$l;
for($i=$start; $i< $num-1;$i++)
{
if(ord(substr($string,$i,1))>0xa0) $j++;
}
if($j%2!=0)
{
$num=$num+1;
}else
{
$num=$num;
}
return substr($string,$start,$num-1).$tail;
}
}
/***
* 中英文字符截取
* $string 要处理的字符串
* $strlen 截取后字符串长度
* $encoding 截取字符的编码格式
* $title 是否在title中显示完整的字符串
* $etc 截取后显示的字符
*/
public function cn_substr($string,$strlen=10,$encoding="UTF-8",$title=false,$etc='...',$mode=0,$utf8LenFlag="no")
{
if ($encoding == "UTF-8"){
mb_internal_encoding($encoding);
}
$rstr = $string;
$retval = "";
$nod = "";
//匹配不含有中文字符
if(preg_match_all("/^[^".chr(0xa1)."-".chr(0xff)."]+$/",$rstr,$match)){
//判断纯非中文字符是否乘以2的长度
$utf8Len = mb_strlen($match[0][0],$encoding);
if ($mode === 0){
if($utf8LenFlag != "no"){
$utf8Len = mb_strwidth($match[0][0],$encoding);
}
$strlen = ($strlen-1)*2;
}
else{
if($utf8LenFlag == "yes"){
$strlen = $strlen*2;
}
}
if($utf8Len == $strlen){
$rstr;
}
elseif($utf8Len > $strlen){
$rstr = mb_substr($rstr,0,$strlen).$etc.$nod.$retval;
if ($title){
$rstr = '<font title="'.$string.'">'.$rstr.'</font>';
}
}
else{
$rstr = $string;
}
}
else{
if ($mode === 1){ //一个汉字算一个字符、一个字母也算一个字符的情况
if(mb_strlen($rstr,$encoding) > $strlen){
$rstr = mb_substr($rstr,0,$strlen-1,$encoding).$etc.$nod.$retval;
if ($title){
$rstr = '<font title="'.$string.'">'.$rstr.'</font>';
}
}
else {
$rstr = $string;
}
}
if ($mode === 0){ //一个汉字算两个字符、一个字母算一个字符的情况
if($utf8LenFlag == "no"){
$utf8Len = mb_strlen($rstr,$encoding);
}
else{
$utf8Len = mb_strwidth($rstr,$encoding);
}
if($utf8Len > $strlen){
$rstr = $this->cn_substring($string,$strlen,0,$encoding,$title,$etc).$etc;
if ($title){
$rstr = '<font title="'.$string.'">'.$rstr.'</font>';
}
}
else {
$rstr = $string;
}
}
}
return $rstr;
}
/***********************(四)*****************/
//中文截取2,单字节截取模式
public function cn_substring($str,$slen,$startdd=0,$cfg_soft_lang='UTF-8',$title=false,$etc='...')
{
if($cfg_soft_lang=='UTF-8')
{
return $this->cn_substr_utf8($str,$slen,$startdd,$title,$etc);
}
$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中文截取,单字节截取模式
public function cn_substr_utf8($str, $length, $start=0, $title=false, $etc='...')
{
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;
}
以上为截取字符串的总结。代码均已经过测试



已有