登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

pcwanli的博客

nx

 
 
 

日志

 
 

PHP中文转拼音(数据库版带分析)  

2010-11-27 23:05:26|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

PHP中文转拼音:
<?php
function GetPinyin($str,$ishead=0,$isclose=1){
    global $pinyins;
    $restr = "";
    $str = trim($str);
    $slen = strlen($str);
    if($slen<2) return $str;
    if(count($pinyins)==0){
        $fp = fopen("pinyin.db","r");
        while(!feof($fp)){
            $line = trim(fgets($fp));
            $pinyins[$line[0].$line[1]] = substr($line,3,strlen($line)-3);
        }
        fclose($fp);
    }
    for($i=0;$i<$slen;$i++){
        if(ord($str[$i])>0x80)
        {
            $c = $str[$i].$str[$i+1];
            $i++;
            if(isset($pinyins[$c])){
                if($ishead==0) $restr .= $pinyins[$c];
                else $restr .= $pinyins[$c][0];
            }else $restr .= "-";
        }else if( eregi("[a-z0-9]",$str[$i]) ){    $restr .= $str[$i]; }
        else{ $restr .= "-"; }
    }
    if($isclose==0) unset($pinyins);
    return $restr;
}
echo GetPinyin('罗大右');
?>

来自:http://bbs.blueidea.com/thread-2882574-1-1.html


附一则:


     织梦中添加分类时填写中文分类名可以自动转换成对应的拼音,该函数位于include/inc/inc_fun_funAdmin.php 第4行到32行.织梦版本为3.1.该函数转换需要的中文拼音数据库位于include/data/pinyin.db.
详细分析请看代码注释,如有地方分析的不对请高人指点!
   1 function SpGetPinyin( $str , $ishead = 0 , $isclose = 1 )
   2 {
   3     // 全部数组$pinyins
   4     global $pinyins ;
   5     $restr = "" ; // 初始化返回字符串变量
   6     $str = trim ( $str ); // 去空格
   7     $slen = strlen ( $str ); // 得到字符串长度
   8     if ( $slen < 2 ) return $str ; // 如果小于2则返回
   9     if ( count ( $pinyins ) == 0 ) // 如果全局数组$pingyins长度为0
10      {
11          $fp = fopen ( dirname ( __FILE__ ) . " /../data/pinyin.db " , " r " ); // 读取pinyin数据库
12          while ( ! feof ( $fp )) // 循环至文件结束位置
13          {
14               $line = trim ( fgets ( $fp )); // 从文件指针中读取一行并去除空格
15               //$line[0].$line[1]中文字,作为数组索引
16               //substr($line,3,strlen($line)-3)得到该字对应的拼音
17               $pinyins [ $line [ 0 ] . $line [ 1 ]] = substr ( $line , 3 , strlen ( $line ) - 3 );
18           }
19           fclose ( $fp );
20      }
21      for ( $i = 0 ; $i < $slen ; $i ++ )
22      {
23           if ( ord ( $str [ $i ]) > 0x80 ) // 如果第i的字符的ASCII编码大于0x80(确认为中文字)
24           {
25
26                  $c = $str [ $i ] . $str [ $i + 1 ]; // 拼接字符编码
27                   $i ++ ;
28                   if ( isset ( $pinyins [ $c ])) // 如果$pinyin数组中含有该索引
29                   {
30                         // $ishead == 0 取全部拼音
31                         if ( $ishead == 0 ) $restr .= $pinyins [ $c ];
32                         // 只取拼音第一个字母
33                         else $restr .= $pinyins [ $c ][ 0 ];
34                    } else $restr .= " _ " ; // 如果没有索引则使用_替代
35            }
36            else if ( eregi ( " [a-z0-9] " , $str [ $i ]) ) // 如果不是中文字是字母和数字
37            {
38                  $restr .= $str [ $i ]; // 直接连接字符串
39             }
40              else // 如果都不是
41              {
42                     $restr .= " _ " ; // 使用_替代
43               }
44       }
45       // 根据参数注销$pinyins
46       if ( $isclose == 0 ) unset ( $pinyins );
47       // 返回转换好的拼音
48       return $restr ;
49 }

 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。

简化代码提取如下:
function SpGetPinyin( $str , $ishead = 0 , $isclose = 1 ) {
     global $pinyins ; 
     $restr = "" ;
     $str = trim ( $str );
     $slen = strlen ( $str );
     if ( $slen < 2 ) return $str ;
     if ( count ( $pinyins ) == 0 ){
          $fp = fopen ( dirname ( __FILE__ ) . " /../data/pinyin.db " , " r " );
          while ( ! feof ( $fp )){
               $line = trim ( fgets ( $fp ));
               $pinyins [ $line [ 0 ] . $line [ 1 ]] = substr ( $line , 3 , strlen ( $line ) - 3 );
          }
          fclose ( $fp );
      }
      for ( $i = 0 ; $i < $slen ; $i ++ ){
          if ( ord ( $str [ $i ]) > 0x80 ){
              $c = $str [ $i ] . $str [ $i + 1 ]; 
              $i ++ ;
              if ( isset ( $pinyins [ $c ])) {
                  if ( $ishead == 0 )
                  $restr .= $pinyins [ $c ];
              else
                  $restr .= $pinyins [ $c ][ 0 ];
              }
              else $restr .= " _ " ;
           }else if ( eregi ( " [a-z0-9] " , $str [ $i ]) ){
                $restr .= $str [ $i ];
           } else{
                $restr .= " _ " ;
           }
     }
     if ( $isclose == 0 ) unset ( $pinyins );
     return $restr ;
}

  评论这张
 
阅读(1465)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018