国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php截斷帶html字符串文章內容的方法

2024-05-04 21:57:05
字體:
來源:轉載
供稿:網友

文章截斷使用主要是在列表頁面時我沒有寫描述這樣只能在文章中截取字符串了,但使用php 自帶函數會導致div未結束,從而頁面混亂了,那么要如何解決此問題呢?

博主寫好一篇文章,博客后臺一般會在搜索頁面或者列表頁面給出文章標題和截斷了的的文章部分作為進一步閱讀的入口。

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

$str,需要截斷的字符串

$start,截斷開始處

$length,長度(注意,這個跟mb_strimwidth不同,1就代表一個中文字符)

$encoding,編碼,我設為 utf-8

例,截斷文章標題,控制在15個文字,代碼如下:

<?php echo mb_substr('m.survivalescaperooms.com原創', 0, 15,"utf-8"); ?>

這樣對于純文本沒問題,但是我的是中間有html標簽的于是問題來了,怎樣截斷一篇文章,注意,這篇文章不僅僅是普通的字符串文本,而是包含了各種格式化標簽和樣式內容的文本,如果處理不當,這些閉合標簽無法正常關閉,從而破壞整個文檔流。

如果單純是純文本,下面這個函數差不多是夠用的,代碼如下:

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

但是,如果需要截斷是網頁中的某部分格式化文本,上面的函數就不夠用了,它不具備處理格式化標簽的能力。

這時,需要一個新函數,它應該是以上函數的升級加強版,它必須有能力正確的處理標簽,下面找到一個

strip_tags() 函數剝去 HTML、XML 以及 PHP 的標簽。

例子1,代碼如下:

  1. <?php 
  2. echo strip_tags("Hello <b>world!</b>"); 
  3. ?> 

輸出:Hello world!

這樣就好做了我們只要在上面基礎上如下操作,代碼如下:

  1. <?php 
  2. $a = strip_tags("Hello <b>world!</b>"); 
  3. substr_ext( $a,10) ; 
  4. //但是發現html不見了這個也不是什么好的解決辦法了。 
  5. ?> 

接著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('&''"''<''>'), array($pre . '&' . $end$pre . '"' . $end$pre . '<' . $end$pre . '>' . $end), $string); 
  62.         $strcut = ''
  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 . '&' . $end$pre . '"' . $end$pre . '<' . $end$pre . '>' . $end), array('&''"''<''>'), $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. }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 通河县| 二连浩特市| 垦利县| 方山县| 牟定县| 阿克| 宜州市| 泾川县| 富裕县| 开原市| 连城县| 遂川县| 广昌县| 高青县| 紫金县| 镇平县| 九龙县| 宁国市| 峨边| 吉首市| 泰州市| 宣化县| 京山县| 衢州市| 剑阁县| 鄯善县| 龙井市| 嘉祥县| 天柱县| 砚山县| 宁陵县| 安陆市| 凌海市| 曲周县| 秦皇岛市| 新邵县| 平山县| 林州市| 盈江县| 资中县| 桑日县|