php 自定义函数实现博客文章预览,无乱码,自动补齐HTML标签

这两个函数可以解决以下几个问题:
PHP截取中文字符串,易乱码;
表客文章都是用编辑器写出来的,里面有HTML标签,而我们截取博客文章,可能会把HTML标签截断,导致页面布局混乱,形如<div><tr><td width="100"></td><div><br /><p></p>之类;
效果如图:
cut.jpg (13.54 KB)
2008-9-17 10:56

我想的办法是:
先从数据库查询500个字节出来,再用function mysubstr($str) 中文截取函数取前490个字节,这样中文就没有被截断;

再用function closetags($html)函数来关闭html标签;

太痛苦了,为了实现在博客首页显示所有文章的预览(截取一段文章),可费了不少心思啊,类似新浪博客的预览之类,

几经周折,在茫茫网上中,在帮助手册上找到一些内容,经过修改,整理,终于实现了我要的效果,特意共享出来!(可能还有一些不足,有啥bug请联系我QQ451396534),复制PHP内容到剪贴板PHP代码: function mysubstr($str) {
//正确截取中文字符串
$start = 1;
$len = 395;
    $tmpstr = "";
    $strlen = $start + $len;
     for($i = 0; $i < $strlen; $i++) {
         if(ord(substr($str, $i, 1)) > 0xa0) {
            $tmpstr .= substr($str, $i, 2);
            $i++;
         } else
            $tmpstr .= substr($str, $i, 1);
     }
     return $tmpstr;
}
function closetags($html){
/*截取最后一个 < 之前的内容,确保字符串中所有HTML标签都以 > 结束*/
$html=preg_replace("~<[^<>]+?$~i", "", $html);
/*自动匹配补齐未关闭的HTML标签*/
#put all opened tags into an array
preg_match_all("#<([a-z]+)( .*[^/])?(?!/)>#iU",$html,$result);
$openedtags=$result[1];
#put all closed tags into an array
preg_match_all("#</([a-z]+)>#iU",$html,$result);
$closedtags=$result[1];
$len_opened = count($openedtags);
# all tags are closed
if(count($closedtags) == $len_opened){
   return $html;
}
$openedtags = array_reverse($openedtags);
# close tags
for($i=0;$i<$len_opened;$i++) {
   if (!in_array($openedtags[$i],$closedtags)){
   $html .= '</'.$openedtags[$i].'>';
   } else {
    unset($closedtags[array_search($openedtags[$i],$closedtags)]);
   }
}
return $html;
}

使用方法也讲一下吧,因为在博客首页显示的内容都是从数据库查询出来的,是一个二维的数组,而我们要应用这两个函数的可能就一个content字段,
例如:复制PHP内容到剪贴板PHP代码: 查询时:SELECT id, title, left( content, 400 ) AS content from blog;

$rows = 500;   // 数组的总行数,自已定义;
for ($i=0;$i<$rows;$i++){  //此循环用于对数组中每行的content元素进行处理;
     $article[$i]['content'] = mysubstr($article[$i]['content']);
     $article[$i]['content'] = closetags($article[$i]['content']);
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值