HTML内容截断函数 本帖最后由 xuzuning 于 2010-07-08 09:56:11 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 声明一下,第一个循环本来可以用preg_split代替的,但是当我在传到有的php版本下时,这个函数得到了分隔数数组的值,所以用了循环! 以下是修正了字符集的版本,/* 含Html的内容截取函数copyright www.cizhixin.netauthor: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);} 我一般是用str_pos定位然后截取的。 想买个这个OA系统,大家觉得怎么样? PHP5.3中用PDO出错 急救:如何解决PHP的Out of dynamic memory in yy_create_buffer()问题?! PHP序列化熟悉的麻烦进来看下 求教各路高手,一下情况该如何写正则表达式!跪谢了! php+mysql+apache怎么下载和配置啊? cakePHP model层校验时,页面显示问题 关于$HTTP_POST_VARS 在widowns 2003服务器里问题 url支持中文路径 请高手解决域名注册搜索器是怎么做的? 求一个php免费开源的在线客服系统 PHP投票系统把服务器刷挂了
含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);
}