本帖最后由 xuzuning 于 2010-07-08 09:56:11 编辑

解决方案 »

  1.   

    声明一下,第一个循环本来可以用preg_split代替的,但是当我在传到有的php版本下时,这个函数得到了分隔数数组的值,所以用了循环!
      

  2.   

    以下是修正了字符集的版本,/*
    含Html的内容截取函数
    copyright www.cizhixin.net
    author:jason
    */
    function htmlSubString($content,$maxlen=300,$charset="gb2312",$error=0,$sus=''){

    $curlength=0;
    $Tags=array();
    $outstr='';
    $singletags=array('br');
    $cut=false;
    //把字符按HTML标签变成数组。
    for($i=0;$i<mb_strlen($content,$charset);$i++){
    $letter=$content{$i};
    if($letter!='<'&&$letter!='>'){
    $tempv.=$letter;
    }else{
    if($letter=='<'&&$content{$i+1}!==' '){//新标记开始
    if(trim($tempv)!=''){$contents[]=$tempv;}
    $tempv=$letter;
    }elseif($letter=='>'&&$tempv{0}=='<'){ //标记结束
    $tempv.=$letter;
    if(trim($tempv)!=''){$contents[]=$tempv;}
    $tempv='';
    }else{
    $tempv.=$letter;
    }
    }
    }
    if(trim($tempv)!==''){$contents[]=$tempv;} foreach($contents as $value){

    if(preg_match('/<\S[^<>]*?>/si',$value)){ //处理标记

    if(mb_substr($value,0,2,$charset)=='</'){
    $endTag=mb_substr($value,2,mb_strlen($value,$charset)-3,$charset);
    if(count($Tags)<1){
    $outstr.='<'.$endTag.'>'.$value; //纠正错误标记
    continue;
    } //丢弃错误结束标记
    $tagName=array_pop($Tags);
    while($tagName!=$endTag && $tagName!==''){
    $outstr.="</".$tagName.">";
    if(count($Tags)>0){
    $tagName=array_pop($Tags);
    }else{
    $tagName='';
    }
    }
    $outstr.=$value;
    }elseif(mb_substr($value,0,3,$charset)=='</ '){ //处理'</ '这样的错误标记
    $outstr.=$value;continue;
    }else{
    //取得起始标记
    if(strpos($value,' ')!==false){
    $tagName=strtolower(mb_substr($value,1,strpos($value,' ')-1,$charset));
    }else{
    $tagName=strtolower(mb_substr($value,1,-1,$charset));
    }
    //非单标签压入标记到堆栈,并添加到返回字符串
    if(!in_array($tagName,$singletags)){array_push($Tags,$tagName);}
    $outstr.=$value;
    }
    }else{ //处理内容
    $curlength+=mb_strlen($value,$charset);

    if($maxlen<=$curlength){
    if($maxlen<$curlength){ //规避特殊标记内容不允许截断
    if(count($Tags)>0&&preg_match('/object|iframe|script|embed/is',$Tags[count($Tags)-1])){
    $outstr.=$value;
    }else{
    $outstr.=mb_substr($value,0,$maxlen-$curlength,$charset);
    }
    }else{
    $outstr.=$value;
    }
    while(count($Tags)>0){
    $tagName=array_pop($Tags);
    $outstr.="</".$tagName.">";
    }
    $cut=true;
    break;
    }else{
    $outstr.=$value;continue;
    }
    }
    }
    return array($outstr,$cut);
    }
      

  3.   

    我一般是用str_pos定位然后截取的。