php 中文字符串統計、截取

這幾天複習基礎時,看到字符串這一章,有個題目是給文章分頁!

如是就自己動手寫寫。本以爲很簡單的,結果卻折騰了兩天,期間老是東看西看,東做西做的,一點也不專注………… //批評下自己

好在,終於弄出一個。只不過需要使用者自己傳入當前的字符編碼o(╯□╰)o。網上找到的都是利用各字符編碼所在ASCII碼中的十六進制區間來判斷漢字………… //我承認我技術不行

下邊是代碼。 //寫完之後就來發博客,鞏固、加深印象 :-D

注:每個英文字母、漢字、特殊字符不管佔多少字節,我這裏始終按一個字符進行處理

轉載地址:http://www.cnblogs.com/cntnn11/archive/2012/08/05/2624066.html (其實還是我)

<?php
 header("content-type:text/html; charset=utf-8");
 echo '<pre>';
 /**
  *    字符串統計,每個字符按一個長度計算
  *        支持GBK,UTF8
  *    類似mb_strlen()
  *    @author 譚寧寧
  *    @time 2012-08-05
  */    
 if( !function_exists('strcount'))
 {
     function strcount($string, $char='utf8')
     {
         $count    = strlen($string);
         $i        = 0;    //當前的字節數
         $j        = 0;    //按照字符進行累加
         while ($i<$count)
         {
             //英文及半角特殊字符
             if(ord($string[$i]) >=0 && ord($string[$i]) <=126)
             {    $charset    = 'en';    }
             //漢字及全角字符
             else
             {    $charset    = $char;}
 
             switch (strtolower($charset))
             {
                 case 'gb2312':
                 case 'gbk':
                     $i        += 1;
                     break;
                 case 'utf8':
                     $i        += 2;
                     break;
                 case 'en':
                 default:
                     break;
             }
             $j++;
             $i++;
         }
         return $j;
     }
 }
 else
 {    echo '<p>fun strcount exists!</p>';    }
 
 /**
  *    自定義字符串截取函數,防止mb_substr()沒有開啓
  *    通過用戶輸入的$char來判斷當前漢字的字符集編碼
  *    @param int $start 開始的字符數
  *    @param int $offest 偏移量,及從$start開始往後輸出多少個字符
  *    @param str $char 使用者手動輸入當前的漢字符編碼
  *    @author 譚寧寧
  *    @time 2012-08-05
  */    
 if( !function_exists('strsub'))
 {
     function strsub($string, $start=0, $offest=0, $char='utf8')
     {
         $count    = strlen($string);
         $rs        = '';
         $i        = 0;    //按字節數累計
         $j        = 0;    //按字符數累計
         $size    = 1;    //記錄每次substr時的終止位置,漢字需要考慮gbk和utf8兩種情況
         while ($i < $count)
         {
             //英文及半角特殊字符
             if(ord($string[$i]) >=0 && ord($string[$i]) <=126)
             {    $charset    = 'en';    }
             //漢字及全角字符
             else
             {    $charset    = $char;}
             
             switch (strtolower($charset))
             {
                 case 'gb2312':
                 case 'gbk':
                     $i        += 1;
                     $size    = 2;
                     break;
                 case 'utf8':
                     $i        += 2;
                     $size    = 3;
                     break;
                 case 'en':
                 default:
                     $size    = 1;
                     break;
             }
             
             if($j < intval($start+$offest) && $j >= $start)
             {
                 $tstart    = intval($i-$size)+1;
                 $rs        .= substr($string, $tstart, $size);
             }
             $j++;
             $i++;
         }
         return $rs;
     }
 }
 else
 {    echo '<p>fun strsub exists!</p>';    }
 
 /*$string    = '123456789漢字胡總溫中文啊abcdefghijklmn·=-';
 echo 'substr():',substr($string, 9, 3),'<br />';
 echo '長度:',strcount($string),'<br />';
 echo '截取測試:',strsub($string, 0, 11),'<br />';*/
 
 $fileContent    = file_exists('reg.txt') ? file_get_contents('reg.txt') : '';
 
 $count            = strcount($fileContent);
 $page            = !isset($_GET['p']) ? 1 : $_GET['p'];    //獲取當前頁碼,默認爲1
 $pagesize        = 350;    //每頁多少字符
 $pagecount        = $count/$pagesize;
 $pagecount        = strpos($pagecount, '.') ? intval($pagecount)+1 : intval($pagecount);    //總頁碼,如果出現小數,那麼就得+1頁
 $start            = $page<=1 ? 0 : ($page-1)*$pagesize;
 
 $fileContent    = strsub($fileContent, $start, $pagesize, 'utf8');
 ?>
 
 <header>
 <style type="text/css">
 p
 {    margin: 10px; word-wrap: break-word; border:#000 1px solid; padding:5px;    }
 p a
 {    margin: 5px;    }
 </style>
 </header>
 <body>
 <p><?php echo $fileContent; ?></p>
 
 <p>
 <?php
 echo "共有字符:$count /每頁 $pagesize 個  ";
 echo " 共 $pagecount 頁/當前第 $page 頁";
 
 if($page <= 1)
 {
     echo '<a>首頁</a>';
     echo '<a>上一頁</a>';
 }
 else
 {
     $up    = $page-1;
     echo "<a href='/contentpage.php?p=1'>首頁</a>";
     echo "<a href='/contentpage.php?p=$up'>上一頁</a>";
 }
 
 if($page == $pagecount)
 {
     echo '<a>下一頁</a>';
     echo '<a>尾頁</a>';
 }
 else
 {
     $down    = $page+1;
     echo "<a href='/contentpage.php?p=$down'>下一頁</a>";
     echo "<a href='/contentpage.php?p=$pagecount'>尾頁</a>";
 }
 ?>
 </p>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章