热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php截断带html字符串文章内容的方法

文章截断使用主要是在列表页面时我没有写描述这样只能在文章中截取字符串了,但使用php自带函数会导致div未结束,从而页面混乱了,那么要

文章截断使用主要是在列表页面时我没有写描述这样只能在文章中截取字符串了,但使用php 自带函数会导致div未结束,从而页面混乱了,那么要如何解决此问题呢?

博主写好一篇文章,博客后台一般会在搜索页面或者列表页面给出文章标题和截断了的的文章部分作为进一步阅读的入口。

Function: mb_substr( $str, $start, $length, $encoding )

$str,需要截断的字符串

$start,截断开始处

$length,长度(注意,这个跟mb_strimwidth不同,1就代表一个中文字符)

$encoding,编码,我设为 utf-8

例,截断文章标题,控制在15个文字,代码如下:

这样对于纯文本没问题,但是我的是中间有html标签的于是问题来了,怎样截断一篇文章,注意,这篇文章不仅仅是普通的字符串文本,而是包含了各种格式化标签和样式内容的文本,如果处理不当,这些闭合标签无法正常关闭,从而破坏整个文档流。

如果单纯是纯文本,下面这个函数差不多是够用的,代码如下:

  1.     /** 
  2.      * 字符串截取,支持中文和其他编码 
  3.      * 
  4.      * @param string $str 需要转换的字符串 
  5.      * @param string $start 开始位置 
  6.      * @param string $length 截取长度 
  7.      * @param string $charset 编码格式 
  8.      * @param string $suffix 截断字符串后缀 
  9.      * @return string 
  10.      */ 
  11.     function substr_ext($str$start=0, $length$charset="utf-8"$suffix=""
  12.     { 
  13.         if(function_exists("mb_substr")){ 
  14.              return mb_substr($str$start$length$charset).$suffix
  15.     } 
  16.         elseif(function_exists('iconv_substr')){ 
  17.              return iconv_substr($str,$start,$length,$charset).$suffix
  18.         } 
  19.         $re['utf-8']  = "/[x01-x7f]|[xc2-xdf][x80-xbf]|[xe0-xef][x80-xbf]{2}|[xf0-xff][x80-xbf]{3}/"
  20.         $re['gb2312'] = "/[x01-x7f]|[xb0-xf7][xa0-xfe]/"
  21.         $re['gbk']    = "/[x01-x7f]|[x81-xfe][x40-xfe]/"
  22.         $re['big5']   = "/[x01-x7f]|[x81-xfe]([x40-x7e]|xa1-xfe])/"
  23.         preg_match_all($re[$charset], $str$match); 
  24.         $slice = join("",array_slice($match[0], $start$length)); 
  25.         return $slice.$suffix
  26.     } 

但是,如果需要截断是网页中的某部分格式化文本,上面的函数就不够用了,它不具备处理格式化标签的能力。

这时,需要一个新函数,它应该是以上函数的升级加强版,它必须有能力正确的处理标签,下面找到一个

strip_tags() 函数剥去 HTML、XML 以及 PHP 的标签。

例子1,代码如下:

  1. echo strip_tags("Hello world!"); 
  2. ?> 

输出:Hello world!

这样就好做了我们只要在上面基础上如下操作,代码如下:

  1. $a = strip_tags("Hello world!"); 
  2. substr_ext( $a,10) ; 
  3. //但是发现html不见了这个也不是什么好的解决办法了。 
  4. ?> 

接着google 发现cns写了一个支持html截取字符串的函数,代码如下:

  1. /** 
  2.  
  3.  * 获取字符在字符串中第N次出现的位置 
  4.  * @param string $text 字符串 
  5.  * @param string $key 字符 
  6.  * @param int $int N 
  7.  * @return int  
  8.  */ 
  9. function strpos_int($text$key$int
  10.     $keylen = strlen($key); 
  11.     global $textlen
  12.     if (!$textlen
  13.         $textlen = strlen($text); 
  14.     static $textpos = 0; 
  15.     $pos = strpos($text$key); 
  16.     $int--; 
  17.     if ($pos
  18.     { 
  19.         if ($int == 0) 
  20.             $textpos+=$pos
  21.         else 
  22.             $textpos+=$pos + $keylen
  23.     } 
  24.     else 
  25.     { 
  26.         $int = 0; 
  27.         $textpos = $textlen
  28.     } 
  29.     if ($int > 0) 
  30.     { 
  31.         strpos_int(substr($text$pos + $keylen), $key$int); 
  32.     } 
  33.     return $textpos
  34.  
  35. /** 
  36.  * 截取HTML 
  37.  * @param string $string  HTML 字符串 
  38.  * @param int $length 截取的长度 
  39.  * @param string $dot 
  40.  * @param string $append 
  41.  * @return string 
  42.  */ 
  43. function cuthtml($string$length$dot = ' ...'$append = ""
  44.     $str = strip_tags($string);//先过滤标签 
  45.     $new_str = iconv_substr($str, 0, $length'utf-8'); 
  46.     $last = iconv_substr($new_str, -1, 1, 'utf-8'); 
  47.     $sc = substr_count($new_str$last); 
  48.     $position = strpos_int($string$last$sc); //获取截取真实的长度 
  49.     if (function_exists('tidy_parse_string'))//服务器开启tidy的话 直接用函数不全html代码即可 
  50.     { 
  51.         $options = array("show-body-only" => true); 
  52.         return tidy_parse_string(mb_substr($string, 0, $position) . $dot . $append$options'UTF8'); 
  53.     } else //没有开启tidy 
  54.     { 
  55.         if (strlen($string) <= $position
  56.         { 
  57.             return $string
  58.         } 
  59.         $pre = chr(1); 
  60.         $end = chr(1); 
  61.         $string = str_replace(array(&#39;&&#39;&#39;"&#39;&#39;<&#39;&#39;>&#39;), array($pre . &#39;&&#39; . $end$pre . &#39;"&#39; . $end$pre . &#39;<&#39; . $end$pre . &#39;>&#39; . $end), $string); 
  62.         $strcut = &#39;&#39;
  63.         $n = $tn = $noc = 0; 
  64.         while ($n < strlen($string)) 
  65.         { 
  66.             $t = ord($string[$n]); 
  67.             if ($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) 
  68.             { 
  69.                 $tn = 1; 
  70.                 $n++; 
  71.                 $noc++; 
  72.             } elseif (194 <= $t && $t <= 223) 
  73.             { 
  74.                 $tn = 2; 
  75.                 $n += 2; 
  76.                 $noc += 2; 
  77.             } elseif (224 <= $t && $t <= 239) 
  78.             { 
  79.                 $tn = 3; 
  80.                 $n += 3; 
  81.                 $noc += 2; 
  82.             } elseif (240 <= $t && $t <= 247) 
  83.             { 
  84.                 $tn = 4; 
  85.                 $n += 4; 
  86.                 $noc += 2; 
  87.             } elseif (248 <= $t && $t <= 251) 
  88.             { 
  89.                 $tn = 5; 
  90.                 $n += 5; 
  91.                 $noc += 2; 
  92.             } elseif ($t == 252 || $t == 253) 
  93.             { 
  94.                 $tn = 6; 
  95.                 $n += 6; 
  96.                 $noc += 2; 
  97.             } else 
  98.             { 
  99.                 $n++; 
  100.             } 
  101.             if ($noc >= $position
  102.             { 
  103.                 break
  104.             } 
  105.         } 
  106.         if ($noc > $position
  107.         { 
  108.             $n -= $tn
  109.         } 
  110.         $strcut = substr($string, 0, $n); 
  111.         $strcut = str_replace(array($pre . &#39;&&#39; . $end$pre . &#39;"&#39; . $end$pre . &#39;<&#39; . $end$pre . &#39;>&#39; . $end), array(&#39;&&#39;&#39;"&#39;&#39;<&#39;&#39;>&#39;), $strcut); 
  112.         $pos = strrpos($strcutchr(1)); 
  113.         if ($pos !== false) 
  114.         { 
  115.             $strcut = substr($strcut, 0, $pos); 
  116.         } 
  117.         return $strcut . $dot . $append
  118.     } 
  119. }

推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
author-avatar
mobiledu2502884697
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有