这两个函数可以解决以下几个问题:
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代码:
例如:复制PHP内容到剪贴板PHP代码:
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']);
}