欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php獲取漢字首字母的函數(shù)

 更新時(shí)間:2013年11月07日 15:09:09   作者:  
本文介紹用php實(shí)現(xiàn)漢字轉(zhuǎn)化為首字母的方法,主要功能是:功能明確,易于修改維護(hù)和擴(kuò)展; 英文的字串:不變返回(包括數(shù)字);中文字符串:返回拼音首字符; 中英混合串: 返回拼音首字符和英文

網(wǎng)上的方法有不少,都是一樣的原理,按照需求,做了一下版本的class類文件,主要功能是:功能明確,易于修改維護(hù)和擴(kuò)展; 英文的字串:不變返回(包括數(shù)字);中文字符串:返回拼音首字符; 中英混合串: 返回拼音首字符和英文。該算法采用了二分法查找,修復(fù)了之前字母Z讀取成Y的錯(cuò)誤。好東西要收藏,故在此留下印記,以供后人考證!

復(fù)制代碼 代碼如下:

<?php
 /**
* Modified by http://iulog.com @ 2013-05-07
* 修復(fù)二分法查找方法
* 漢字拼音首字母工具類
*  注: 英文的字串:不變返回(包括數(shù)字)    eg .abc123 => abc123
*      中文字符串:返回拼音首字符        eg. 測試字符串 => CSZFC
*      中英混合串: 返回拼音首字符和英文   eg. 我i我j => WIWJ
*  eg.
*  $py = new str2PY();
*  $result = $py->getInitials('啊吧才的餓飛就好i就看了嗎你哦平去人是他uv我想一在');
*/
class str2PY
{
    private $_pinyins = array(
        176161 => 'A',
        176197 => 'B',
        178193 => 'C',
        180238 => 'D',
        182234 => 'E',
        183162 => 'F',
        184193 => 'G',
        185254 => 'H',
        187247 => 'J',
        191166 => 'K',
        192172 => 'L',
        194232 => 'M',
        196195 => 'N',
        197182 => 'O',
        197190 => 'P',
        198218 => 'Q',
        200187 => 'R',
        200246 => 'S',
        203250 => 'T',
        205218 => 'W',
        206244 => 'X',
        209185 => 'Y',
        212209 => 'Z',
    );
    private $_charset = null;
    /**
     * 構(gòu)造函數(shù), 指定需要的編碼 default: utf-8
     * 支持utf-8, gb2312
     *
     * @param unknown_type $charset
     */
    public function __construct( $charset = 'utf-8' )
    {
        $this->_charset    = $charset;
    }
    /**
     * 中文字符串 substr
     *
     * @param string $str
     * @param int    $start
     * @param int    $len
     * @return string
     */
    private function _msubstr ($str, $start, $len)
    {
        $start  = $start * 2;
        $len    = $len * 2;
        $strlen = strlen($str);
        $result = '';
        for ( $i = 0; $i < $strlen; $i++ ) {
            if ( $i >= $start && $i < ($start + $len) ) {
                if ( ord(substr($str, $i, 1)) > 129 ) $result .= substr($str, $i, 2);
                else $result .= substr($str, $i, 1);
            }
            if ( ord(substr($str, $i, 1)) > 129 ) $i++;
        }
        return $result;
    }
    /**
     * 字符串切分為數(shù)組 (漢字或者一個(gè)字符為單位)
     *
     * @param string $str
     * @return array
     */
    private function _cutWord( $str )
    {
        $words = array();
         while ( $str != "" )
         {
            if ( $this->_isAscii($str) ) {/*非中文*/
                $words[] = $str[0];
                $str = substr( $str, strlen($str[0]) );
            }else{
                $word = $this->_msubstr( $str, 0, 1 );
                $words[] = $word;
                $str = substr( $str, strlen($word) );
            }
         }
         return $words;
    }
    /**
     * 判斷字符是否是ascii字符
     *
     * @param string $char
     * @return bool
     */
    private function _isAscii( $char )
    {
        return ( ord( substr($char,0,1) ) < 160 );
    }
    /**
     * 判斷字符串前3個(gè)字符是否是ascii字符
     *
     * @param string $str
     * @return bool
     */
    private function _isAsciis( $str )
    {
        $len = strlen($str) >= 3 ? 3: 2;
        $chars = array();
        for( $i = 1; $i < $len -1; $i++ ){
            $chars[] = $this->_isAscii( $str[$i] ) ? 'yes':'no';
        }
        $result = array_count_values( $chars );
        if ( empty($result['no']) ){
            return true;
        }
        return false;
    }
    /**
     * 獲取中文字串的拼音首字符
     *
     * @param string $str
     * @return string
     */
    public function getInitials( $str )
    {
        if ( empty($str) ) return '';
        if ( $this->_isAscii($str[0]) && $this->_isAsciis( $str )){
            return $str;
        }
        $result = array();
        if ( $this->_charset == 'utf-8' ){
            $str = iconv( 'utf-8', 'gb2312', $str );
        }
        $words = $this->_cutWord( $str );
        foreach ( $words as $word )
        {
            if ( $this->_isAscii($word) ) {/*非中文*/
                $result[] = $word;
                continue;
            }
            $code = ord( substr($word,0,1) ) * 1000 + ord( substr($word,1,1) );
            /*獲取拼音首字母A--Z*/
            if ( ($i = $this->_search($code)) != -1 ){
                $result[] = $this->_pinyins[$i];
            }
        }
        return strtoupper(implode('',$result));
    }
    private function _getChar( $ascii )
    {
        if ( $ascii >= 48 && $ascii <= 57){
            return chr($ascii);  /*數(shù)字*/
        }elseif ( $ascii>=65 && $ascii<=90 ){
            return chr($ascii);   /* A--Z*/
        }elseif ($ascii>=97 && $ascii<=122){
            return chr($ascii-32); /* a--z*/
        }else{
            return '-'; /*其他*/
        }
    }

    /**
     * 查找需要的漢字內(nèi)碼(gb2312) 對(duì)應(yīng)的拼音字符( 二分法 )
     *
     * @param int $code
     * @return int
     */
    private function _search( $code )
    {
        $data = array_keys($this->_pinyins);
        $lower = 0;
        $upper = sizeof($data)-1;
  $middle = (int) round(($lower + $upper) / 2);
        if ( $code < $data[0] ) return -1;
        for (;;) {
            if ( $lower > $upper ){
                return $data[$lower-1];
            }
            $tmp = (int) round(($lower + $upper) / 2);
            if ( !isset($data[$tmp]) ){
    return $data[$middle];
            }else{
    $middle = $tmp;
   }
            if ( $data[$middle] < $code ){
                $lower = (int)$middle + 1;
            }else if ( $data[$middle] == $code ) {
                return $data[$middle];
            }else{
                $upper = (int)$middle - 1;
            }
        }
    }
}
?>

相關(guān)文章

  • yii2利用自帶UploadedFile實(shí)現(xiàn)上傳圖片的示例

    yii2利用自帶UploadedFile實(shí)現(xiàn)上傳圖片的示例

    本篇文章主要介紹了yii2利用自帶UploadedFile實(shí)現(xiàn)上傳圖片的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • thinkphp使用literal防止模板標(biāo)簽被解析的方法

    thinkphp使用literal防止模板標(biāo)簽被解析的方法

    這篇文章主要介紹了thinkphp使用literal防止模板標(biāo)簽被解析的方法,可實(shí)現(xiàn)針對(duì)一些不需要解析的模板標(biāo)簽直接輸出,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-11-11
  • php之Aes加密案例講解

    php之Aes加密案例講解

    這篇文章主要介紹了php之Aes加密案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • PHP 獲取指定地區(qū)的天氣實(shí)例代碼

    PHP 獲取指定地區(qū)的天氣實(shí)例代碼

    這篇文章主要介紹了PHP 獲取指定地區(qū)的天氣實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • php生成驗(yàn)證碼,縮略圖及水印圖的類分享

    php生成驗(yàn)證碼,縮略圖及水印圖的類分享

    這篇文章主要給大家分享的是php生成驗(yàn)證碼,縮略圖,及水印圖的類,十分的實(shí)用,有需要的小伙伴可以參考下
    2016-04-04
  • php中url函數(shù)介紹及使用示例

    php中url函數(shù)介紹及使用示例

    本文主要介紹了PHP處理url字符串編碼、解碼與解析。下面進(jìn)行詳細(xì)的舉例說明
    2014-02-02
  • Yii2.0表關(guān)聯(lián)查詢實(shí)例分析

    Yii2.0表關(guān)聯(lián)查詢實(shí)例分析

    這篇文章主要介紹了Yii2.0表關(guān)聯(lián)查詢的方法,結(jié)合實(shí)例形式分析了Yii中關(guān)聯(lián)查詢的實(shí)現(xiàn)方法與相關(guān)使用技巧,需要的朋友可以參考下
    2016-07-07
  • PHP判斷指定時(shí)間段的2個(gè)方法

    PHP判斷指定時(shí)間段的2個(gè)方法

    有時(shí)我們需要在一天中的某個(gè)時(shí)間段進(jìn)行某項(xiàng)任務(wù),或者在一天中的不同小時(shí)里進(jìn)行不同的任務(wù),使用PHP如何實(shí)現(xiàn)呢,下面的兩個(gè)例子都可以解決這個(gè)問題
    2014-03-03
  • yii框架搜索分頁modle寫法

    yii框架搜索分頁modle寫法

    這篇文章主要介紹了yii框架搜索分頁modle寫法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • php URL跳轉(zhuǎn)代碼 減少外鏈

    php URL跳轉(zhuǎn)代碼 減少外鏈

    有時(shí)候我們需要添加外鏈但對(duì)于網(wǎng)站來說過多外鏈?zhǔn)遣缓玫?,那么我們可以通過跳轉(zhuǎn)來實(shí)現(xiàn)。
    2011-06-06

最新評(píng)論