PHPCMS V9 使str_cut可以输出html源代码

原创 2015年11月21日 03:33:31

PHPCMS V9 的str_cut函数相比substr可以截断UTF-8而不出现乱码,但它会将<和>都转义,从而让最终的html标记直接显示了出来,而如果用 strip_tags 预处理,也只是去掉了所有的html标记。我希望又能输出html源代码,又能正常截断。于是将str_cut修改了一下。


直接上代码,主要思路是将<和>替换为<.和.>,这样可以避免与html标记冲突。


/**
  * 字符截取 支持UTF8/GBK 但保留HTML格式
  * @param $string
  * @param $length
  * @param $dot
  */
 function html_cut($string, $length, $dot = '...') {
 	$strlen = strlen($string);
 	if($strlen <= $length) return $string;
 	$string = str_replace(
 	    array(' ','&nbsp;', '&amp;', '&quot;', '&#039;', '&ldquo;', '&rdquo;', '&mdash;', '&lt;', '&gt;', '&middot;', '&hellip;'),
 	    array('∵',' ', '&', '"', "'", '“', '”', '—', '<.', '.>', '·', '…'),     //<.和.>是为了保证不与HTML的尖括号冲突
 	    $string);
 	$strcut = '';
 	if(strtolower(CHARSET) == 'utf-8') {
 		$length = intval($length-strlen($dot)-$length/3);
 		$n = $tn = $noc = 0;
 		while($n < strlen($string)) {
 			$t = ord($string[$n]);
 			if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
 				$tn = 1; $n++; $noc++;
 			} elseif(194 <= $t && $t <= 223) {
 				$tn = 2; $n += 2; $noc += 2;
 			} elseif(224 <= $t && $t <= 239) {
 				$tn = 3; $n += 3; $noc += 2;
 			} elseif(240 <= $t && $t <= 247) {
 				$tn = 4; $n += 4; $noc += 2;
 			} elseif(248 <= $t && $t <= 251) {
 				$tn = 5; $n += 5; $noc += 2;
 			} elseif($t == 252 || $t == 253) {
 				$tn = 6; $n += 6; $noc += 2;
 			} else {
 				$n++;
 			}
 			if($noc >= $length) {
 				break;
 			}
 		}
 		if($noc > $length) {
 			$n -= $tn;
 		}
 		if($n + 1 <= strlen($string)) {
 		    $cross_word = substr($string, $n - 1, 2);
 		    if($cross_word == '<.' || $cross_word == '.>') {
 		        $n += 1;    //确保截断后包含完整的<.和.>
            }
 		}
 		$strcut = substr($string, 0, $n);
 		$strcut = str_replace(
 		    array('∵', '&', '"', "'", '“', '”', '—', '<.', '.>', '·', '…'),
 		    array(' ', '&amp;', '&quot;', '&#039;', '&ldquo;', '&rdquo;', '&mdash;', '&lt;', '&gt;', '&middot;', '&hellip;'),
 		    $strcut);
 	} else {
 		$dotlen = strlen($dot);
 		$maxi = $length - $dotlen - 1;
 		$current_str = '';
 		$search_arr = array('&',' ', '"', "'", '“', '”', '—', '<.', '.>', '·', '…','∵');
 		$replace_arr = array('&amp;','&nbsp;', '&quot;', '&#039;', '&ldquo;', '&rdquo;', '&mdash;', '&lt;', '&gt;', '&middot;', '&hellip;',' ');
 		$search_flip = array_flip($search_arr);
 		for ($i = 0; $i < $maxi; $i++) {
 			$current_str = ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
 			if($i + 1 < strlen($string)) {
                $cross_word = substr($string, $i, 2);
                if($cross_word == '<.' || $cross_word == '.>') {
                    $current_str .= $string[++$i];    //确保截断后包含完整的<.和.>
                }
            }
 			if (in_array($current_str, $search_arr)) {
 				$key = $search_flip[$current_str];
 				$current_str = str_replace($search_arr[$key], $replace_arr[$key], $current_str);
 			}
 			$strcut .= $current_str;
 		}
 	}
 	return $strcut.$dot;
 }

最后放到phpcms/libs/functions/extension.func.php中,就可以在模板中调用了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【phpcms-v9】header.html文件编译前后对比

编译前: {if isset($SEO['title']) && !empty($SEO['title'])}{$SEO['title']}{/if}{$SEO['site_title']...

【phpcms-v9】index.php文件分析-前台列表页代码分析

//路径:phpcms/modules/content/index.php控制器 //列表页:文章列表页、图片列表页、下载列表页执行的都是这段程序 public function lists() { ...

【phpcms-v9】前台其它模块pc标签的调用说明

----------------------------------------------------------------comment模块pc标签的调用说明------------------...

phpcms v9代码解读

一、数据库加载: 数据库配置文件:安装时填写的数据库配置数据存储在caches/configs/database.php (1)index.php入库文件,并加载phpcms/base.php...

phpcms v9 邮件群发实现方法

自己的网站B5教程网,看到很多注册会员后没有邮箱验证,但是会员比较多,一个一个发送邮件很烦,于是就自己二次开发了一个邮件群发功能,现在分享给大家。记得收藏哦! phpcms v9邮件群发功能是在...

【phpcms-v9】缓存目录caches下的各个文件的作用

第一:caches/caches_commons目录下缓存文件: 1.caches/caches_commons/caches_data/category_content.cache.php: ...

【phpcms-v9】后台content模块的content.php控制器文件分析-后台添加内容代码分析

//第一步: //路径:phpcms/modules/content/content.php //构造方法 public function __construct() { parent::__co...

phpcms v9 调用方法全站点击排行

/** * 排行榜标签 * @param $data */ public function hits($data) { $catid = intval($data['catid'])...

phpcms v9 邀请用户注册自动获取积分奖励

第一,首先在会员中心得到邀请注册的链接加个邀请人ID,(邀请人id是获取当前登录用户的id)如下: 第二,phpcms/modules/member/index.php文件的  $userid =...

phpcms v9的表单向导实现问答咨询功能的方法

本文主要介绍了在phpcms v9的表单向导里实现问答咨询功能的方法 phpcms v9内容管理系统本身是没有问答模块的,只有表单向导,但表单向导有很大的局限性,通过表单向导,我们只...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)