[整理]PHP字符串截取函数

PHP截取中文字符串,UTF-8、GBK 
  1. <?php  
  2. function substring($str$start$len) {  
  3.      $tmpstr = "";  
  4.      $strlen = $start + $len;  
  5.      for($i = 0; $i < $strlen$i++) {  
  6.          if(ord(substr($str$i, 1)) > 0xa0) {  
  7.              $tmpstr .= substr($str$i, 2);  
  8.              $i++;  
  9.          } else  
  10.              $tmpstr .= substr($str$i, 1);  
  11.      }  
  12.      return $tmpstr;  
  13. }   
  14. ?>  

  1. <?php  
  2. function c_substr($string$from$length = null){  
  3.      preg_match_all('/[\x80-\xff]?./'$string$match);  
  4.      if(is_null($length)){  
  5.          $result = implode(''array_slice($match[0], $from));  
  6.      }else{   
  7.          $result = implode(''array_slice($match[0], $from$length));   
  8.      }   
  9.      return $result;  
  10. }  
  11. $str = "zhon华人min共和guo";  
  12. $from = 3;  
  13. $length = 7;  
  14. echo(c_substr($str$from$length));  
  15. // 输出: n华人min共  
  16. //还有utf-8的  
  17. /* 
  18. Regarding windix's function to handle UTF-8 strings:  
  19. one can use the "u" modifier on the regular expression so that the pattern string is treated as UTF-8 
  20. (available from PHP 4.1.0 or greater on Unix and from PHP 4.2.3 on win32). 
  21. This way the function works for other encodings too (like Greek for example).  
  22. The modified function would read like this:  
  23. */  
  24. function utf8_substr($str,$start) {   
  25.     $null = "";  
  26.     preg_match_all("/./u"$str$ar);   
  27.     if(func_num_args() >= 3) {   
  28.         $end = func_get_arg(2);   
  29.         return join($nullarray_slice($ar[0],$start,$end));   
  30.     } else {   
  31.         return join($nullarray_slice($ar[0],$start));   
  32.     }   
  33. }  
  34. ?>  

  1. <?php  
  2.   
  3. function cnSubStr($string,$sublen)   
  4. {   
  5. if($sublen>=strlen($string))   
  6. {   
  7. return $string;   
  8. }   
  9. $s="";   
  10. for($i=0;$i<$sublen;$i++)   
  11. {   
  12. if(ord($string{$i})>127)   
  13. {   
  14. $s.=$string{$i}.$string{++$i};   
  15. continue;   
  16. }else{   
  17. $s.=$string{$i};   
  18. continue;   
  19. }   
  20. }   
  21. return $s;   
  22. }  
  23.   
  24. //Example:  
  25. echo "<p>__________________________<p>";     
  26. $string="242432反对感是456犯得上广泛大使馆地方7890";     
  27. $sublen=strlen($string);     
  28. $len=20;     
  29. echo $string."<p>";     
  30. echo "总长为:".($sublen+1)."<p>";     
  31. echo "截取数:".$len."<p>";  
  32. for($i=1;$i<=$sublen+1;$i++){     
  33. if($i>$len){     
  34. echo $i."<b> →</b> ".cnSubStr($string,$i)."…<br>";     
  35. continue;     
  36. }     
  37. echo $i."<b> →</b> ".cnSubStr($string,$i)."<br>";     
  38. }    
  39. ?>  

因为证书中有中文,所以需要在PHP中进行GB2312与UTF-8的互换。
网上搜索一下这方面相关资料,说是需要php_iconv.dll的支持,可是我在PHP5文件夹中根本找不到这个文件,但是奇怪的是在PHP4中有这个,然后我将PHP4中的php_iconv.dll文件,复制到system32下,却提示出现错误,我想应该也不行,毕竟PHP4和PHP5里面的文件应该不兼容。到这里我就想删除了PHP5,装一个PHP4算了,后来发现一段话:iconv and libxml are compiled into php5ts.dll so you don't need the dll's in version 5.所以只要转换如下:
  1. //GB2312 -- UTF-8  
  2. iconv("GB2312","UTF-8",$text)  
  3. //UTF-8 -- GB2312  
  4. iconv("UTF-8","GB2312",$text)  

php5內建支援iconv,因此僅有php4的使用者需要安裝

1.首先必須確定你的php資料夾中有extensions,dlls這兩個資料夾

若沒有,請到 http://www.php.net/downloads.php 下載PHP 4.4.x zip package的版本(約7MB)

2.將extensions\php_iconv.dll , dlls\iconv.dll 這兩個檔案複製到windows的目錄下方

3.開啟php.ini(一般是在windows目錄下),將 ;extension=php_iconv.dll 前面的分號去除

4.重新啟動Apache即可

【摘 要】 不管是uft-8编码转换为gb2312,还是将 gb2312 转换为 uft-8 ,都是一样道理,php4.3.1以后的iconv函数很好用的,只是需要自己写一个uft8到unicode的转换函数查表(gb2312.txt)也行 
不管是uft-8编码转换为gb2312,还是将 gb2312 转换为 uft-8 ,都是一样道理,php4.3.1以后的iconv函数很好用的,只是需要自己写一个uft8到unicode的转换函数查表(gb2312.txt)也行。




  1. <?  
  2. $text = "电子书库";  
  3. preg_match_all("/[\x80-\xff]?./",$text,$ar);  
  4. foreach($ar[0] as $v)  
  5.    echo "&#".utf8_unicode(iconv("GB2312","UTF-8",$v)).";";  
  6. ?>  
  7. <?  
  8. // utf8 -> unicode  
  9. function utf8_unicode($c) {  
  10.     switch(strlen($c)) {  
  11.      case 1:  
  12.        return ord($c);  
  13.      case 2:  
  14.        $n = (ord($c[0]) & 0x3f) << 6;  
  15.        $n += ord($c[1]) & 0x3f;  
  16.        return $n;  
  17.      case 3:  
  18.        $n = (ord($c[0]) & 0x1f) << 12;  
  19.        $n += (ord($c[1]) & 0x3f) << 6;  
  20.        $n += ord($c[2]) & 0x3f;  
  21.        return $n;  
  22.      case 4:  
  23.        $n = (ord($c[0]) & 0x0f) << 18;  
  24.        $n += (ord($c[1]) & 0x3f) << 12;  
  25.        $n += (ord($c[2]) & 0x3f) << 6;  
  26.        $n += ord($c[3]) & 0x3f;  
  27.        return $n;  
  28.    }  
  29. }  
  30. ?>  

下面的例子是利用php将uft-8这中编码转换为gb2312.

  1. <?php  
  2. function u2utf82gb($c){  
  3.      $str="";  
  4.      if ($c < 0x80) {  
  5.           $str.=$c;  
  6.      } else if ($c < 0x800) {  
  7.           $str.=chr(0xC0 | $c>>6);  
  8.           $str.=chr(0x80 | $c & 0x3F);  
  9.      } else if ($c < 0x10000) {  
  10.           $str.=chr(0xE0 | $c>>12);  
  11.           $str.=chr(0x80 | $c>>6 & 0x3F);  
  12.           $str.=chr(0x80 | $c & 0x3F);  
  13.      } else if ($c < 0x200000) {  
  14.           $str.=chr(0xF0 | $c>>18);  
  15.           $str.=chr(0x80 | $c>>12 & 0x3F);  
  16.           $str.=chr(0x80 | $c>>6 & 0x3F);  
  17.           $str.=chr(0x80 | $c & 0x3F);  
  18.      }  
  19.      return iconv('UTF-8''GB2312'$str);  
  20. }  
  21. ?>  

或者是

  1. <?php  
  2. function unescape($str) {  
  3.    $str = rawurldecode($str);  
  4.    preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r);  
  5.    $ar = $r[0];  
  6. print_r($ar);  
  7.    foreach($ar as $k=>$v) {  
  8.      if(substr($v,0,2) == "%u")  
  9.        $ar[$k] = iconv("UCS-2","GB2312",pack("H4",substr($v,-4)));  
  10.      elseif(substr($v,0,3) == "&#x")  
  11.        $ar[$k] = iconv("UCS-2","GB2312",pack("H4",substr($v,3,-1)));  
  12.      elseif(substr($v,0,2) == "&#") {  
  13. echo substr($v,2,-1)."<br>";  
  14.        $ar[$k] = iconv("UCS-2","GB2312",pack("n",substr($v,2,-1)));  
  15.      }  
  16.    }  
  17.    return join("",$ar);  
  18. }  
  19. $str = "TTL全天候自动聚焦";  
  20. echo unescape($str);  
  21. ?>  

  1. <?php   
  2. $string="2006年4月我又长大了一岁!";   
  3. echo substr($string,1)."...";    
  4. //截取字符串    
  5. function SubstrGB($in,$num){   
  6.   $pos=0;   
  7.   $out="";   
  8.   while($pos<strlen($in)){   
  9.      $c=substr($in,$pos,1);   
  10.      if($c=="\n"break;   
  11.      if(ord($c)>128){   
  12.         $out.=$c;   
  13.         $pos++;   
  14.         $c=substr($in,$pos,1);   
  15.         $out.=$c;   
  16.      }else{   
  17.         $out.=$c;   
  18.      }   
  19.      $pos++;   
  20.      if($pos>=$numbreak;   
  21.    }   
  22.    return $out;   
  23. }    
  24. echo SubstrGB($string,8);   
  25. ?>    
  26. <?php   
  27. function cut_str($string$sublen$start = 0, $code = 'UTF-8')   
  28. {   
  29.      if($code == 'UTF-8')   
  30.      {   
  31.          $pa = "/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/";   
  32.          preg_match_all($pa$string$t_string);   
  33.          if(count($t_string[0]) - $start > $sublenreturn join(''array_slice($t_string[0], $start$sublen))."...";   
  34.          return join(''array_slice($t_string[0], $start$sublen));   
  35.      }   
  36.      else   
  37.      {   
  38.          $start   = $start*2;   
  39.          $sublen = $sublen*2;   
  40.          $strlen = strlen($string);   
  41.          $tmpstr = '';   
  42.          for($i=0; $i<$strlen$i++)   
  43.          {   
  44.              if($i>=$start && $i<($start+$sublen))   
  45.              {   
  46.              if(ord(substr($string$i, 1))>129) $tmpstr.= substr($string$i, 2);   
  47.              else $tmpstr.= substr($string$i, 1);   
  48.              }    
  49.              if(ord(substr($string$i, 1))>129) $i++;   
  50.          }   
  51.          if(strlen($tmpstr)<$strlen ) $tmpstr.= "...";   
  52.          return $tmpstr;   
  53.      }   
  54. }   
  55.      echo "<br>".cut_str($string,8,$start=0,$code='sdf') ;   
  56. ?>   

以下代码试用于GB2312编码,截取中文字符串是PHP中一个头疼的问题,解决方法是根据值是否大于等于128来判断是否是双字节字符,以避免出现乱码的情况。但中英文混合、特殊符号等问题总是存在,现在写一个比较全面的,仅供参考:

  程序说明:
  1. len 参数以中文字符为标准,1len等于2个英文字符,为了形式上好看些
  2. 如果将magic参数设为false,则中文和英文同等看待,取绝对的字符数
  3. 特别适用于用htmlspecialchars()进行过编码的字符串
  4. 能正确处理GB2312中实体字符模式(&#93232;)
  程序代码:

  1. <?php  
  2. function FSubstr($title,$start,$len="",$magic=true)   
  3. {  
  4. /** 
  5.    *   powered by Smartpig 
  6.    *  mailto:d.einstein@263.net 
  7.    */  
  8.     
  9. $length = 0;  
  10. if($len == ""$len = strlen($title);  
  11.   
  12. //判断起始为不正确位置  
  13. if($start > 0)  
  14. {  
  15.    $cnum = 0;  
  16.    for($i=0;$i<$start;$i++)  
  17.    {  
  18.     if(ord(substr($title,$i,1)) >= 128) $cnum ++;  
  19.    }  
  20.    if($cnum%2 != 0) $start--;  
  21.     
  22.    unset($cnum);  
  23. }  
  24.   
  25. if(strlen($title)<=$lenreturn substr($title,$start,$len);  
  26.   
  27. $alen    = 0;  
  28. $blen = 0;  
  29.   
  30. $realnum = 0;  
  31.   
  32. for($i=$start;$i<strlen($title);$i++)  
  33. {  
  34.    $ctype = 0;  
  35.    $cstep = 0;  
  36.    $cur = substr($title,$i,1);  
  37.    if($cur == "&")  
  38.    {  
  39.     if(substr($title,$i,4) == "<")  
  40.     {  
  41.      $cstep = 4;  
  42.      $length += 4;  
  43.      $i += 3;  
  44.      $realnum ++;  
  45.      if($magic)  
  46.      {  
  47.       $alen ++;  
  48.      }  
  49.     }  
  50.     else if(substr($title,$i,4) == ">")  
  51.     {  
  52.      $cstep = 4;  
  53.      $length += 4;  
  54.      $i += 3;  
  55.      $realnum ++;  
  56.      if($magic)  
  57.      {  
  58.       $alen ++;  
  59.      }  
  60.     }  
  61.     else if(substr($title,$i,5) == "&")  
  62.     {  
  63.      $cstep = 5;  
  64.      $length += 5;  
  65.      $i += 4;  
  66.      $realnum ++;  
  67.      if($magic)  
  68.      {  
  69.       $alen ++;  
  70.      }  
  71.     }  
  72.     else if(substr($title,$i,6) == """)  
  73.     {  
  74.      $cstep = 6;  
  75.      $length += 6;  
  76.      $i += 5;  
  77.      $realnum ++;  
  78.      if($magic)  
  79.      {  
  80.       $alen ++;  
  81.      }  
  82.     }  
  83.     else if(substr($title,$i,6) == "'")  
  84.     {  
  85.      $cstep = 6;  
  86.      $length += 6;  
  87.      $i += 5;  
  88.      $realnum ++;  
  89.      if($magic)  
  90.      {  
  91.       $alen ++;  
  92.      }  
  93.     }  
  94.     else if(preg_match("/&#(\d+);/i",substr($title,$i,8),$match))  
  95.     {  
  96.      $cstep = strlen($match[0]);  
  97.      $length += strlen($match[0]);  
  98.      $i += strlen($match[0])-1;  
  99.      $realnum ++;  
  100.      if($magic)  
  101.      {  
  102.       $blen ++;  
  103.       $ctype = 1;  
  104.      }  
  105.     }  
  106.    }else{  
  107.     if(ord($cur)>=128)  
  108.     {  
  109.      $cstep = 2;  
  110.      $length += 2;  
  111.      $i += 1;  
  112.      $realnum ++;  
  113.      if($magic)  
  114.      {  
  115.       $blen ++;  
  116.       $ctype = 1;  
  117.      }  
  118.     }else{  
  119.      $cstep = 1;  
  120.      $length +=1;  
  121.      $realnum ++;  
  122.      if($magic)  
  123.      {  
  124.       $alen++;  
  125.      }  
  126.     }  
  127.    }  
  128.     
  129.    if($magic)  
  130.    {  
  131.     if(($blen*2+$alen) == ($len*2)) break;  
  132.     if(($blen*2+$alen) == ($len*2+1))  
  133.     {  
  134.      if($ctype == 1)  
  135.      {  
  136.       $length -= $cstep;  
  137.       break;  
  138.      }else{  
  139.       break;  
  140.      }  
  141.     }  
  142.    }else{  
  143.     if($realnum == $lenbreak;  
  144.    }  
  145. }  
  146.   
  147. unset($cur);  
  148. unset($alen);  
  149. unset($blen);  
  150. unset($realnum);  
  151. unset($ctype);  
  152. unset($cstep);  
  153.   
  154. return substr($title,$start,$length);  
  155. }  
  156.   
  157. ?>  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值