自动生成文章摘要 [JavaScript 版本]
我们在写 BLOG 这样的程序时经常需要显示文章前一部分的, 但是又怕不恰当的截断破坏封闭标签以造成整
个文档结构破坏, 使用我的函数可以在要求不高的情况下解决这个问题
大家应该考虑这个函数在服务端应用还是在客户端应用因为我考虑这个函数可能运行起来比较费机器,
所以安全性要求不高的情况下可以放在客户端上
最好数据表中单独一个字段放这个摘要, 这样相应的数据库查询也优化了牺牲一点点空间换很多时间还
是划算的
再聊一下安全性问题, 主要是内容安全性如果客户端意图更改正常的摘要信息的话, 一般都是 BLOG 的主
人才有这个权力, 那么他使得摘要和原文的一致性破坏就是他自己的事了内容以外的安全性都可以在服
务端解决所以还是推荐在客户端使用本函数
核心代码:
最近应用了一下, 发现上面的函数对多字节字符集支持得不好, 因此重写了一下
如果遇到问题, 不妨试试下面的函数
- function Generate_Brief($text) {
- global $Briefing_Length;
- mb_regex_encoding("UTF-8");
- if (mb_strlen($text) <= BRIEF_LENGTH) return $text;
- $Foremost = mb_substr($text, 0, BRIEF_LENGTH);
- $re = "<(\/?)
- (P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|TABLE|TR|TD|TH|INPUT|SELECT|TEXTAREA|OBJECT|A|UL|OL|LI|
- BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT|SPAN)[^>]*(>?)";
- $Single = "/BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT|BR/i";
- $Stack = array();
- $posStack = array();
- mb_ereg_search_init($Foremost, $re, 'i');
- while ($pos = mb_ereg_search_pos()) {
- $match = mb_ereg_search_getregs();
- /* [Child-matching Formulation]:
- $matche[1] : A "/" charactor indicating whether current "<...>" Friction is
- Closing Part
- $matche[2] : Element Name.
- $matche[3] : Right> of a "<...>" Friction
- */
- if ($match[1] == "") {
- $Elem = $match[2];
- if (mb_eregi($Single, $Elem) && $match[3] != "") {
- continue;
- }
- array_push($Stack, mb_strtoupper($Elem));
- array_push($posStack, $pos[0]);
- } else {
- $StackTop = $Stack[count($Stack) - 1];
- $End = mb_strtoupper($match[2]);
- if (strcasecmp($StackTop, $End) == 0) {
- array_pop($Stack);
- array_pop($posStack);
- if ($match[3] == "") {
- $Foremost = $Foremost.">";
- }
- }
- }
- }
- $cutpos = array_shift($posStack) - 1;
- $Foremost = mb_substr($Foremost, 0, $cutpos, "UTF-8");
- return $Foremost;
}; 欢迎大家找错误谢谢
来源: https://www.php1.cn/detail/php-5de0d280f8.html