当前位置:首页 > PHP教程 > php应用 > 列表

支持中文字符串分割的php解决方案

发布:smiling 来源: PHP粉丝网  添加日期:2015-12-24 14:49:56 浏览: 评论:0 

很多朋友用php分割中文字符串时会遇到乱码的问题,特别是utf-8的编码下,本文我们来提供一个比较好的解决方案,也是本文正在使用的.

php中str_split函数不支持中文分割,我们可以利用mb_xx函数实现.

  1. /** 
  2.  * Convert a string to an array 
  3.  * @param string $str 
  4.  * @param number $split_length 
  5.  * @return multitype:string 
  6.  */ 
  7. function mb_str_split($str,$split_length=1,$charset="UTF-8"){ 
  8.   if(func_num_args()==1){ 
  9.     return preg_split('/(?<!^)(?!$)/u'$str); 
  10.   } 
  11.   if($split_length<1)return false; 
  12.   $len = mb_strlen($str$charset); 
  13.   $arr = array(); 
  14.   for($i=0;$i<$len;$i+=$split_length){ 
  15.     $s = mb_substr($str$i$split_length$charset); 
  16.     $arr[] = $s
  17.   } 
  18.   return $arr

方法二:

  1. function mbStrSplit ($string$len=1) { 
  2.   $start = 0; 
  3.   $strlen = mb_strlen($string); 
  4.   while ($strlen) { 
  5.     $array[] = mb_substr($string,$start,$len,"utf8"); 
  6.     $string = mb_substr($string$len$strlen,"utf8"); 
  7.     $strlen = mb_strlen($string); 
  8.   } //phpfensi.com 
  9.   return $array

php "str_split"函数分割中文字符串乱码问题

问:

  1. // 测试分割中文 
  2. $str2="轻轻地我走了,正如我轻轻的来。"
  3. echo "原字符串:<b>$str2.</b><br/>"
  4. echo "1、以指定长度为5分割字符串:<br/>"
  5. $arr3=str_split($str2,5); 
  6. echo "--\$arr3[0]的值:"."$arr3[0]"."<br/>"
  7. echo "--\$arr3[1]的值:"."$arr3[1]"

结果是:

原字符串:轻轻地我走了,正如我轻轻的来。.

1、以指定长度为5分割字符串:

  1. --$arr3[0]的值:轻轼br/>--$arr3[1]的值:?地漯body> 

乱码!!求解释,求真相!

答:一个解决方案.

测试发现,preg_split对中文(多字节)的分隔符处理可能真的存在问题.

原因可能是正则匹配时不能正常分隔一个多字节字符(猜测).

但我实验用半角(英文)的分隔符就工作得很好.

于是我在处理待分隔的文本前先对文本进行替换,把中文的句点和逗号都替换成英文半角的.然后再使用preg_split,暂时发现工作得不错.

以下是我的测试代码.

  1. <?php 
  2. $test = <<<EOF 
  3. 记者从有关人士处获悉,嫦娥二号发射的各项准备工作全部就绪,昨日经专家组评审,卫星、火箭、发射场、测控等系统均情况正常,具备发射条件。今天起,西昌卫星发射中心的加注手将为火箭加注燃料。 
  4.  
  5. 据一位航天专家介绍,因为地球和月球都在转动的缘故,所以地月之间的最佳交汇点每年仅出现3次,而这3次便是发射探月卫星的最佳节点,经过观测,今年3次的出现时间分别为10月1日、10月2日和10月3日,而最佳发射窗口则是1日晚7时,2日晚8时和3日晚10时,其中国庆日晚7时为佳中之佳。 
  6.  
  7. 针对媒体称10月1日发射窗口时间为晚6时59分57秒,该专家告诉本报记者,早3秒并非提前3秒发射,而是将这3秒时间预留出来,作为现场指挥员在发送倒计时口令的缓冲时间。(记者万强) 
  8. //phpfensi.com 
  9. EOF; 
  10.  
  11. //$input = $_POST[$content];    //........................获取要分割的字符串 
  12. $test = str_replace(",",',',$test); 
  13. $test = str_replace("。",'.',$test); 
  14. $mode="/[,|.]/s";       //......................用“逗号” 和 “句号” 分割字符串  
  15.  
  16. $output = preg_split($mode,$test,-1); 
  17.  
  18. print_r($output); 
  19. ?> 

楼主不防试试,我的代码是gb2312的字串,经测试在,字符串为UTF8时,也可以正常工作.

Tags: php字符串 php中文分隔

分享到: