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中str_cut截取文章内容时p,DIV等标签被截断变形问题

str_cut这个函数在PHPCMS中一个不错的用来截取标题到特定长度或截取内容摘要的函数,在模板中也可使用,常用于文章列表截取标题长度,或者截取内容部分长度。 str_cut这个函数在PH...
  • happyrabbit456
  • happyrabbit456
  • 2013年12月02日 10:16
  • 1599

phpcmsv9后台管理生成首页静态模板技术ob系列函数实现

phpcmsv9后台管理生成首页 m=
  • yhjztoucher
  • yhjztoucher
  • 2014年06月05日 10:41
  • 2058

Phpcms V9手机门户设置教程:怎么用PC V9做手机网站

一、在PHPcms V9管理后台设置手机门户 1.1、开启手机网站。位置:模块 》手机门户 》 添加手机站点,具体设置可参照截图: 填写站点名和LOGO文件相对位置,绑定用于手机网站的二级域名...
  • meimeieee
  • meimeieee
  • 2016年05月19日 09:55
  • 5790

PHPCMS 自定义内容页HTML文件名称

序言:帮一个客户用PHPCMS做了一个网站,要自定义内容页HTML文件名称。 下面将一步一步来修改程序文件,一共涉及到model.sql、url.class.php、html.class.php这三...
  • flydycfly
  • flydycfly
  • 2016年09月23日 16:25
  • 1071

phpcms v9中用PC标签在列表页中调出文章内容

如何用PC标签在列表页中调出文章内容 phpcms v9 moreinfo=”"参数说明 {pc:content action="lists" catid="$catid" num="15" ord...
  • u012145816
  • u012145816
  • 2017年05月24日 16:23
  • 390

【phpcms-v9】cache_all.php文件分析-更新缓存

[html] view plain copy  print? php   //路径:phpcms/modules/admin/cache_all.php控制器,此控制器主...
  • u011792166
  • u011792166
  • 2016年03月27日 09:43
  • 1230

PHPCMS V9 网站数据迁移教程

一、源网站的准备工作 1. 备份数据库   登录网站管理后台,在“扩展”菜单下的“数据库工具”中的“请选择数据链接池”区域中选择在使用的数据链接池,这时在下面会显示相应的表单文件名,全部选择后...
  • zky0901
  • zky0901
  • 2013年09月07日 10:52
  • 4449

phpcmsV9静态页面替换动态步骤

1.先在www目录下找到 phpcms + install_package + phpcms + templates在templates 文件夹里创建个自己的文件夹我弄得是 ceshi 文件夹,在 c...
  • qy6kwyec
  • qy6kwyec
  • 2017年02月22日 13:03
  • 862

优化设置PHPCMS V9的URL规则

默认情况下,phpcms v9的文章URL路径是动态的,如 http://localhost/phpcms/index.php?m=content&c=index&a=show&catid=6&id...
  • zsj523
  • zsj523
  • 2014年09月16日 17:57
  • 3812

phpcms自定义表单向导

phpcms自带的表单向导样式太固定了,不够灵活,有的时候需要使用自己的表单样式; 新建表单向导模块后,添加一些需要的字段,然后点击访问前台: 在打开的页面,右键“审查元素”,获取到表单信息,...
  • luyaran
  • luyaran
  • 2016年11月28日 10:52
  • 2298
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHPCMS V9 使str_cut可以输出html源代码
举报原因:
原因补充:

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