哪位朋友能给我段生成文章摘要的代码? 网上找不到。或者找到的就那两条失效的。。我一点思路也没有。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不太明白,尝试使用substr字数截取。把全文从开头部分截取一定字数,作为文章摘要。如:$newcontent = substr($content, 0, 100) . '…';//$content为整篇文章。开始字数0,结束字数100,尾部加省略号。 只适合gbk的截取<?php//计算字符串的长度function cn_strlen($str){$len=0; for ( $i = 0;$i < strlen($str); $i++ ) {if(ord($str[$i])>127){$i++;$len++;}if(ord($str[$i])<=127)$len++;}return $len;}/*截取字符串* @param string $string 要截取字符串* @params int $tart 开始位置* @param int $endlen 截取长度* @return string*/function cut_string($string,$start,$endlen){ $len=0;for ( $i = 0;$i < strlen($string)&&$len<$endlen; $i++ ) {if(ord($string[$i])>127){if($start<=$len)$cut_string.=chr(ord($string[$i])).chr(ord($string[$i+1]));$i++;$len++;}if(ord($string[$i])<=127){if($start<=$len)$cut_string.=chr(ord($string[$i]));$len++; }}return $cut_string; }/** 截取description主要用于html的head及头条的描述* @param string $string 要截取的字符串* @param int $stringlen 截取长度* @param string $endsting 结束添加字符串* @return string*/function description($string,$stringlen,$endstring="..."){$Nstringlen=cn_strlen($string);if($stringlen>=$Nstringlen){$cut_string=$string.$endstring; }if($stringlen<$Nstringlen){$cut_string=cut_string($string,0,$stringlen).$endstring;}return $cut_string;}$str="没有东西没有东西没有东西没有东西没有东西没有东西没有东西没有东西";echo description($str,10,"...");?> 当从后台提交数据的时候。自动截取一段内容做为摘要。 zblog wordpress(用插件)等blog的首页显示的时候。有一段正内容被提前显示在标题下边。算是一种内容预览。这就是摘要。 我这样解释清楚了没? 其实我最主要的是想看对html的处理,比如摘要我要截取50个字符,但在第48个的地方有一张图片html<img src="xx.gif"/>但如果这样截取会得到: 内容<img 这样的内容。 这个用javascript是最容易办的,还没有编码的烦恼,而且是在客户端完成,提交表单后直接入库。content是内容,abscont是摘要<script type="text/javascript">function getabs(){ var str = document.getElementById("content").value ; var cut = 25;//设置截取长度。 document.getElementById("abscont").value = str.substr(0,cut) + '...';}</script><textarea name="content" id="content" onblur="getabs()">this is contents 这是文章内容这是文章内容123456789</textarea><textarea name="abscont" id="abscont"></textarea> 嗯。谢谢楼上。我看看这段代码。其实只用substr一类的函数我也会。主要是我想看看别人对html如何处理。网上有代码用strip_tags但如果有超链接怎么办。不应该过滤。但正好超链接被sustr分开了。又该怎么办?应该把整个超链接截取上。 如果非要用PHP ,那就用mb_substr()这个函数吧。$str = 'this is contents 这是文章内容这是文章内容123456789';$charset = 'gbk';//设置编码$cut = '25';//设置截取长度$abscont = mb_substr($str,0,$cut,$charset).'...';echo $abscont; 我特想知道如下的该如何处理 <script type="text/javascript">function getabs(){ var str = document.getElementById("content").value ; var cut = 25;//设置截取长度。 document.getElementById("abscont").value = str.substr(0,cut) + '...';}</script><textarea name="content" id="content" onblur="getabs()">this is contents 这是文章内容这<a href="">是</a文章内容123456789</textarea><textarea name="abscont" id="abscont"></textarea> 关于有HTML标签的字符串的截取,截取不能破坏HTML完整性。这个可以参考我的博客的一篇,http://blog.csdn.net/life169/archive/2011/02/25/6206636.aspx 楼主你做摘要截取这个图片干啥子啦,你是想让文章中的图片也在标题下面显示吗?做摘要都是先把<>这种闭合的html先过滤了来,文章中的html在编辑器中就被转义过了的,所以之后不用再考虑超链接之类的了 $str =<<<eof现㈣在有一篇文章㈩,然后我想把<font color="#ff0000"><a href="xxx">asd</a></font>这篇文章截取摘要,<div><font color="#ff0000"><a href="xxxyyy">这个代码</a></font></div>截取前面的30个字符。<img =src="xxxxx">文章中含有若干html标签,<div><img =src="xxxxx"></div>位置不能确定,广告代码不能插入到标签之间,如果插入广告<div><img =src="xxxxx"> sdfdd</div>代码处正好遇到html标签,就将广告代码插入<div><img =src="xxxxx"></div>位置往后移动,直至不在html标签中为止。<div><img =src="xxxxx"></div>请问代码该怎么实现呢?<a href="xxxxx">昨天</a>下了一场大雪。<img src="../img/xx.jpg">这是一张图片。希望大家能给予帮助,谢谢!eof;$exa = array('㈠','㈡','㈢','㈣','㈤','㈥','㈦','㈧','㈨','㈩');$exb = array('①','②','③','④','⑤','⑥','⑦','⑧','⑨','⑩');$str = str_replace($exa,'',$str);$str = str_replace($exb,'',$str);$char = 'gbk'; //设置字符编码$cut = 30 ;//设置截取长度$all = mb_strlen($str,$char) ;if($all <= $cut ){ $abscont = $str ;}else{ if(preg_match_all('/(?:<(?!img)[^>]+>)+.*?(?:<\/\w+>)+/is',$str,$match)){ foreach($match[0] as $k=>$v){ $sk = str_split($k); $sexa = ''; foreach($sk as $sv){ $sexa .= $exa[$sv] ; } $str = str_replace($v ,$sexa,$str); } } if(preg_match_all('/<img[^>]*>/is',$str,$mat)){ foreach($mat[0] as $k=>$v){ $sk = str_split($k); $sexb = ''; foreach($sk as $sv){ $sexb .= $exb[$sv] ; } $str = str_replace($v ,$sexb,$str); } } $abscont = mb_substr($str,0,$cut,$char); $t = mb_substr($abscont,$cut,1,$char); $i = 0; while(in_array($t,$exa) || in_array($t,$exb)){ $i++; $abscont = mb_substr($str,0,$cut+$i,$char); $t = mb_substr($abscont,$cut+$i,1,$char); } if(!empty($match[0])){ arsort($match[0]); foreach($match[0] as $k=>$v){ $sk = str_split($k); $sexa = ''; foreach($sk as $sv){ $sexa .= $exa[$sv] ; } $abscont = str_replace($sexa,$v,$abscont); } } if(!empty($mat[0])){ arsort($mat[0]); foreach($mat[0] as $k=>$v){ $sk = str_split($k); $sexb = ''; foreach($sk as $sv){ $sexb .= $exb[$sv] ; } $abscont = str_replace($sexb,$v,$abscont); } } echo $abscont ; } 给楼主提取了下dede处理摘要的函数基本思路就是先对提交内容html转换为纯文本然后判断编码 然后再截取 //自动摘要 $cfg_auot_description为系统设置的默认截取长度 $body为提交的文章内容 $description 为添加文章时候作者自己填写的描述若没有则从文章主体内容截取 if($description=='' && $cfg_auot_description>0) { $description = cn_substr(html2text($body),$cfg_auot_description); $description = trim(preg_replace('/#p#|#e#/','',$description)); $description = addslashes($description); }//html 转换为纯文本function Html2Text($str,$r=0){ if($r==0) { return SpHtml2Text($str); } else { $str = SpHtml2Text(stripslashes($str)); return addslashes($str); }} function SpHtml2Text($str){ $str = preg_replace("/<sty(.*)\\/style>|<scr(.*)\\/script>|<!--(.*)-->/isU","",$str); $alltext = ""; $start = 1; for($i=0;$i<strlen($str);$i++) { if($start==0 && $str[$i]==">") { $start = 1; } else if($start==1) { if($str[$i]=="<") { $start = 0; $alltext .= " "; } else if(ord($str[$i])>31) { $alltext .= $str[$i]; } } } $alltext = str_replace(" "," ",$alltext); $alltext = preg_replace("/&([^;&]*)(;|&)/","",$alltext); $alltext = preg_replace("/[ ]+/s"," ",$alltext); return $alltext;} //中文截取2,单字节截取模式//如果是request的内容,必须使用这个函数function cn_substrR($str,$slen,$startdd=0){ $str = cn_substr(stripslashes($str),$slen,$startdd); return addslashes($str);}//中文截取2,单字节截取模式function cn_substr($str,$slen,$startdd=0){ global $cfg_soft_lang; if($cfg_soft_lang=='utf-8') { return cn_substr_utf8($str,$slen,$startdd); } $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中文截取,单字节截取模式function cn_substr_utf8($str, $length, $start=0){ 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;} <img》标签是指文章中插入图片是生成的。 【讨论】大家说说php+mysql使用存储过程的优缺点 在windows下编写的php程序怎么在freebsd下不能运行了呢? 这样的网站地址效果是怎样实现的? php 如何获得本地 时区 求一个php正则,想了半个小时没想出来 php(while循环限制显示的记录数) 上传图片出错,这段代码我以前用的时候没报错 怎么办???????????? 我的LINUX(REDHAT8)每次都装不上MYSQL,装了好几次都出现同样的问题.请帮忙解决一下. 大赠送,我站赠送QQ号及虚拟主机、国际域名,详情见贴内! PHP连接数据库问题,大家看下。 老问题:require 和 include
尝试使用substr字数截取。把全文从开头部分截取一定字数,作为文章摘要。
如:
$newcontent = substr($content, 0, 100) . '…';//$content为整篇文章。开始字数0,结束字数100,尾部加省略号。
//计算字符串的长度
function cn_strlen($str){
$len=0;
for ( $i = 0;$i < strlen($str); $i++ ) {
if(ord($str[$i])>127)
{$i++;
$len++;
}
if(ord($str[$i])<=127)
$len++;
}
return $len;
}
/*截取字符串
* @param string $string 要截取字符串
* @params int $tart 开始位置
* @param int $endlen 截取长度
* @return string
*/
function cut_string($string,$start,$endlen)
{ $len=0;
for ( $i = 0;$i < strlen($string)&&$len<$endlen; $i++ ) {
if(ord($string[$i])>127)
{
if($start<=$len)
$cut_string.=chr(ord($string[$i])).chr(ord($string[$i+1]));
$i++;
$len++;
}
if(ord($string[$i])<=127)
{
if($start<=$len)
$cut_string.=chr(ord($string[$i]));
$len++;
}
}
return $cut_string;
}
/*
* 截取description主要用于html的head及头条的描述
* @param string $string 要截取的字符串
* @param int $stringlen 截取长度
* @param string $endsting 结束添加字符串
* @return string
*/
function description($string,$stringlen,$endstring="...")
{
$Nstringlen=cn_strlen($string);
if($stringlen>=$Nstringlen)
{
$cut_string=$string.$endstring;
}
if($stringlen<$Nstringlen)
{
$cut_string=cut_string($string,0,$stringlen).$endstring;
}
return $cut_string;
}
$str="没有东西没有东西没有东西没有东西没有东西没有东西没有东西没有东西";
echo description($str,10,"...");
?>
zblog wordpress(用插件)等blog的首页显示的时候。有一段正内容被提前显示在标题下边。算是一种内容预览。这就是摘要。 我这样解释清楚了没?
<img src="xx.gif"/>
但如果这样截取会得到:
内容<img 这样的内容。
content是内容,abscont是摘要<script type="text/javascript">
function getabs(){
var str = document.getElementById("content").value ;
var cut = 25;//设置截取长度。
document.getElementById("abscont").value = str.substr(0,cut) + '...';
}
</script>
<textarea name="content" id="content" onblur="getabs()">this is contents 这是文章内容这是文章内容123456789</textarea>
<textarea name="abscont" id="abscont"></textarea>
网上有代码用strip_tags
但如果有超链接怎么办。不应该过滤。但正好超链接被sustr分开了。又该怎么办?应该把整个超链接截取上。
$charset = 'gbk';//设置编码
$cut = '25';//设置截取长度
$abscont = mb_substr($str,0,$cut,$charset).'...';
echo $abscont;
<script type="text/javascript">
function getabs(){
var str = document.getElementById("content").value ;
var cut = 25;//设置截取长度。
document.getElementById("abscont").value = str.substr(0,cut) + '...';
}
</script>
<textarea name="content" id="content" onblur="getabs()">this is contents 这是文章内容这<a href="">是</a文章内容123456789</textarea>
<textarea name="abscont" id="abscont"></textarea>
这个可以参考我的博客的一篇,http://blog.csdn.net/life169/archive/2011/02/25/6206636.aspx
$str =<<<eof
现㈣在有一篇文章㈩,然后我想把<font color="#ff0000"><a href="xxx">asd</a></font>这篇文章截取摘要,<div><font color="#ff0000"><a href="xxxyyy">这个代码</a></font></div>截取前面的30个字符。<img =src="xxxxx">文章中含有若干html标签,<div><img =src="xxxxx"></div>位置不能确定,广告代码不能插入到标签之间,如果插入广告<div><img =src="xxxxx"> sdfdd</div>代码处正好遇到html标签,就将广告代码插入<div><img =src="xxxxx"></div>位置往后移动,直至不在html标签中为止。<div><img =src="xxxxx"></div>请问代码该怎么实现呢?<a href="xxxxx">昨天</a>下了一场大雪。<img src="../img/xx.jpg">这是一张图片。
希望大家能给予帮助,谢谢!
eof;$exa = array('㈠','㈡','㈢','㈣','㈤','㈥','㈦','㈧','㈨','㈩');
$exb = array('①','②','③','④','⑤','⑥','⑦','⑧','⑨','⑩');
$str = str_replace($exa,'',$str);
$str = str_replace($exb,'',$str);
$char = 'gbk'; //设置字符编码$cut = 30 ;//设置截取长度
$all = mb_strlen($str,$char) ;
if($all <= $cut ){
$abscont = $str ;
}else{
if(preg_match_all('/(?:<(?!img)[^>]+>)+.*?(?:<\/\w+>)+/is',$str,$match)){
foreach($match[0] as $k=>$v){
$sk = str_split($k);
$sexa = '';
foreach($sk as $sv){
$sexa .= $exa[$sv] ;
}
$str = str_replace($v ,$sexa,$str);
}
}
if(preg_match_all('/<img[^>]*>/is',$str,$mat)){
foreach($mat[0] as $k=>$v){
$sk = str_split($k);
$sexb = '';
foreach($sk as $sv){
$sexb .= $exb[$sv] ;
}
$str = str_replace($v ,$sexb,$str);
}
}
$abscont = mb_substr($str,0,$cut,$char);
$t = mb_substr($abscont,$cut,1,$char);
$i = 0;
while(in_array($t,$exa) || in_array($t,$exb)){
$i++;
$abscont = mb_substr($str,0,$cut+$i,$char);
$t = mb_substr($abscont,$cut+$i,1,$char);
}
if(!empty($match[0])){
arsort($match[0]);
foreach($match[0] as $k=>$v){
$sk = str_split($k);
$sexa = '';
foreach($sk as $sv){
$sexa .= $exa[$sv] ;
}
$abscont = str_replace($sexa,$v,$abscont);
}
}
if(!empty($mat[0])){
arsort($mat[0]);
foreach($mat[0] as $k=>$v){
$sk = str_split($k);
$sexb = '';
foreach($sk as $sv){
$sexb .= $exb[$sv] ;
}
$abscont = str_replace($sexb,$v,$abscont);
}
}
echo $abscont ;
}
基本思路就是
先对提交内容html转换为纯文本
然后判断编码 然后再截取 //自动摘要 $cfg_auot_description为系统设置的默认截取长度 $body为提交的文章内容 $description 为添加文章时候作者自己填写的描述若没有则从文章主体内容截取
if($description=='' && $cfg_auot_description>0)
{
$description = cn_substr(html2text($body),$cfg_auot_description);
$description = trim(preg_replace('/#p#|#e#/','',$description));
$description = addslashes($description);
}//html 转换为纯文本
function Html2Text($str,$r=0)
{
if($r==0)
{
return SpHtml2Text($str);
}
else
{
$str = SpHtml2Text(stripslashes($str));
return addslashes($str);
}
}
function SpHtml2Text($str)
{
$str = preg_replace("/<sty(.*)\\/style>|<scr(.*)\\/script>|<!--(.*)-->/isU","",$str);
$alltext = "";
$start = 1;
for($i=0;$i<strlen($str);$i++)
{
if($start==0 && $str[$i]==">")
{
$start = 1;
}
else if($start==1)
{
if($str[$i]=="<")
{
$start = 0;
$alltext .= " ";
}
else if(ord($str[$i])>31)
{
$alltext .= $str[$i];
}
}
}
$alltext = str_replace(" "," ",$alltext);
$alltext = preg_replace("/&([^;&]*)(;|&)/","",$alltext);
$alltext = preg_replace("/[ ]+/s"," ",$alltext);
return $alltext;
}
//中文截取2,单字节截取模式
//如果是request的内容,必须使用这个函数
function cn_substrR($str,$slen,$startdd=0)
{
$str = cn_substr(stripslashes($str),$slen,$startdd);
return addslashes($str);
}//中文截取2,单字节截取模式
function cn_substr($str,$slen,$startdd=0)
{
global $cfg_soft_lang;
if($cfg_soft_lang=='utf-8')
{
return cn_substr_utf8($str,$slen,$startdd);
}
$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中文截取,单字节截取模式
function cn_substr_utf8($str, $length, $start=0)
{
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;
}