PHP截断HTML输出摘要的问题

在seo中添加description、在分类页输出文章概要时我们经常需要将文章内容截断,仅仅依靠wordpress的the_excerpt()函数是远远不够的,这里分享下截断HTML输出摘要的比较好的方法。

1、处理换行

通过正则表达式实现,代码如下:

preg_replace("/[\s]{1,}/","",$str)

2、截断乱码的问题

我们知道中文字符是双字节,而英文字符是单字节,当截断的位置正好在中文字符的中间,就会出现乱码。同样通过正则表达式解决:

preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.'((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s','$1',$str)

3、HTML实体部分截断的问题

但遇到HTML实体如&nsp;时,当截取到其中间位置时,就只剩下一部分代码如&ns了。虽然怎么影响阅读,但是会造成无法通过W3C校验,也是个必须要解决问题

个人认为比较好的思路:先使用这些实体转换为字符,由于是单个字节就不会出现别拦腰截断的情况了,最后再转换成HTML实体。PHP中相关的函数有两个htmlentities()与html_entity_decode()、htmlspecialchars()与htmlspecialchars_decode(),网上部分文章声称这两者是等价的,其实这是完全错误的。前一对是转换HTML实体,后一对者是转换html_entity_decode(),具体不同可以阅读HTML特殊字符表HTML实体表

因此我们使用html_entity_decode()转换HTML实体为字符,然后截取,最后使用htmlentities()再转换回来。值得指出的是,htmlentities()与html_entity_decode()函数需要制定编码(默认为ISO-8859-1),不然会乱码,通常国内编码为UTF-8或GB2312。

综合上述三点,最后的函数为:

<?php 
if (!function_exists('html2excerpt')) {
 function html2excerpt($str, $from, $len) //$str:处理字符串,$from:开始截断位置,$len:截断的长度
 {
$str=html_entity_decode($str, ENT_QUOTES, 'UTF-8');
return htmlentities(preg_replace("/[\s]{1,}/","",preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.'((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s','$1',strip_tags($str))), ENT_QUOTES, 'UTF-8');
 }
}
?>

本文采用CC BY-NC-ND协议进行许可,传播时请保留链接:http://huangzhiqun.com/skill/html2excerpt.html

2,226 次阅读
  1. 目前还没有评论

发表评论

× 八 = 六十 四

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。

疑惑 调皮 伤心 抠鼻 惊讶 微笑 脸红 坏笑 惊讶 发呆 撇嘴 酷 阴险 咒骂 愤怒 白眼 鼓掌 得意 汗 打呵欠 大哭 憨笑

评论