提取摘要不应该截断单词
在优化推广过程中,经常会需要对文章或者产品的内容进行提取指定长度摘要的操作,用来生成网页的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