提取摘要不应该截断单词
在优化推广过程中,经常会需要对文章或者产品的内容进行提取指定长度摘要的操作,用来生成网页的description或其他描述功能。生成指定长度摘要一方面用来满足指定长度的数据存储要求,另一方面可以根据需要生成符合SEO要求描述文字,还可以兼顾网页排版需要,是所有网站制作都必须要使用的常规操作。
很多人在用程序对字符串进行提取摘要的操作非常简单,直接使用substr或者mb_substr或其他类似字符串截取操作,这样的操作简单直接,并没有什么大的问题,尤其是在中文营销推广中,没有什么问题。因为对于中文,日语,韩语等这种表意文字而言,单个字符即有意义;而对于英语,西班牙语,俄语,法语等其他一些国际通用的语言来说,这样的操作很容易截断单词,稍显不完美。

Domai CMS可以通过dm_trim_word函数截取字符串,接收三个参数,第一个为要截取的字符串,第二个长度,第三个为截取之后的提示字符,默认为省略号。在刚开始,系统直接使用mb_substr进行简单截取,但考虑到某些环境可能没有安装mbstring扩展,加上对单词进行截取并不完美,所以系统了字符串截取功能,支持中文和其他语言的字符串截取,摘要提取等功能,这里共享一下此函数,供参考学习:
/*
* 截取指定内容的文字片段,用于在HTML页面展示
* 不能破坏单词,但会对超长单词进行截取,默认为最长为15个字符
*
* @param $string string 指定的字符串
* @param $maxlen int 最大字符长度
* @param $more string 更多提示
*/
function dm_trim_words($string, $maxlen, $more='…'){
//删除所有html标签
$string = dm_strip_all_tags($string);
//转化实体字符
$string = html_entity_decode($string, ENT_QUOTES);
//替换空格
$string = preg_replace('#[\x{00a0}\x{1680}\x{180e}\x{2000}-\x{200d}\x{202f}\x{205f}\x{3000}\x{feff}\r\n\t\s]+#siu', ' ', $string);
if(dm_strlen($string) <= $maxlen)
return $string;
$words_array = preg_split('/\b/u', $string, -1, PREG_SPLIT_NO_EMPTY);
$countlen = 0;
foreach($words_array as $index=>$words){
$charlength = dm_strlen($words);
$countlen += $charlength;
if($countlen >= $maxlen)
break;
}
$words_array = array_slice($words_array, 0, $index);
$returnstring = implode('', $words_array);
if($charlength > 15){
$leftlength = $maxlen - dm_strlen($returnstring);
$leftword = dm_substr($words, 0 ,$leftlength);
$returnstring = $returnstring.$leftword;
}
return trim($returnstring).$more;
}
评论列表
涛哥小弟:小涛哥 2020-05-05 19:50:10