http://www.sgcha.cn/cha.php 在文本处理中,尤其是大段的文本处理,由于html语言的规则以及文本编码的不同,使得文字容易出现乱码。同时由于换行的不同,使得文本要经常进行段落重排。 段落重排的标识主要是根据特定的标点符号来进行。具体参考代码中的注释
http://www.sgcha.cn/cha.php
$strtest = '这个是第一个 句子, 的第一部分。 的反对法 的飞洒? \u3434, '; $strtest =cut_str_by_mb ($strtest ); echo "<pre class="brush:php;toolbar:false">"; echo $strtest; /********************************************************************* 输入一个字串 此处的关键是段落的标点,是一个utf-8的编码 返回排版后的字串。 *********************************************************************/ function cut_str_by_mb ($str,$arr_tag=NULL){ if($arr_tag==NULL){ $arr_tag=array( '\u2026', '\u201d', '\u302', '\uff1f', ':', '\uff1a', ); } $str=set_char_set($str);//不管先检查字符格式,转化成utf-8的再说 $str=unescape($str);//把里面16进制编码的转化成utf-8的格式 $tmp_array=preg_split("/((\r(?!\n))|((?<!\r)\n)|(\r\n))/", $str);//根据换行符拆分成数组 $tmp_val=''; foreach($tmp_array as $v){ if(!empty($tmp_val)){ $v=trim($v);//去掉字符的首尾空格 } $tmp_val=$tmp_val.$v;//链接后面的值,组成新的字串 $len=mb_strlen( $tmp_val, 'utf-8') ; $endtag=mb_substr($tmp_val,$len-1,1,'utf-8'); $u_tag=unicode_encode($endtag); if (in_array($u_tag, $arr_tag)) { $return_arr[]=$tmp_val; $tmp_val=''; } } $return_str=implode("\r\n",$return_arr); return $return_str; } /**************************************************************** 检查编码,统一用utf-8 **********************************************************************/ function set_char_set($data){ if( !empty($data) ){ $fileType = mb_detect_encoding($data , array('UTF-8','GBK','LATIN1','BIG5')) ; if( $fileType != 'UTF-8'){ $data = mb_convert_encoding($data ,'utf-8' , $fileType); } } return $data; } /**************************************************************** 把其中的&# 以及joson格式转化成中文 **********************************************************************/ function unescape($str) { $str = rawurldecode($str); preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r); $ar = $r[0]; // print_r($ar); foreach($ar as $k=>$v) { if(substr($v,0,2) == "%u"){ $ar[$k] = iconv("UCS-2BE","UTF-8",pack("H4",substr($v,-4))); } elseif(substr($v,0,3) == "&#x"){ $ar[$k] = iconv("UCS-2BE","UTF-8",pack("H4",substr($v,3,-1))); } elseif(substr($v,0,2) == "&#") { $ar[$k] = iconv("UCS-2BE","UTF-8",pack("n",substr($v,2,-1))); } } return join("",$ar); } /**************************************************************** 把utf-8编码的字符返回 unicode的字串 **********************************************************************/ function unicode_encode($name){ $name = iconv('UTF-8', 'UCS-2', $name); $len = strlen($name); $str = ''; for ($i = 0; $i < $len - 1; $i = $i + 2){ $c = $name[$i]; $c2 = $name[$i + 1]; if (ord($c) > 0){ // 两个字节的文字 $str .= '\u'.base_convert(ord($c), 10, 16).base_convert(ord($c2), 10, 16); }else{ $str .= $c2; } } return $str; }