分享一段PHP制作的中文拼音首字母工具类
发布时间:2020-12-13 02:15:56 所属栏目:PHP教程 来源:网络整理
导读:《PHP实战:分享一段PHP制作的中文拼音首字母工具类》要点: 本文介绍了PHP实战:分享一段PHP制作的中文拼音首字母工具类,希望对您有用。如果有疑问,可以联系我们。 代码很简单,这里就不多BB了,大家看注释吧,注释都看不懂的小伙伴,求放过PHP!!! PHP编程 代
《PHP实战:分享一段PHP制作的中文拼音首字母工具类》要点: 代码很简单,这里就不多BB了,大家看注释吧,注释都看不懂的小伙伴,求放过PHP!!!PHP编程
代码如下:
<?php /** * 汉字拼音首字母工具类 *? 注: 英文的字串:不变返回(包含数字)??? eg .abc123 => abc123 *????? 中文字符串:返回拼音首字符??????? eg. 测试字符串 => CSZFC *????? 中英混合串: 返回拼音首字符和英文?? eg. 我i我j => WIWJ *? eg. *? $py = new str2PY(); *? *? $result = $py->getInitials('周杰伦'); * *? //获取首字母 *? $result = $py->getFirstString('abc');? //A *? $resutl = $py->getFirstString("周杰伦"); //Z * */ class str2py { ??? private $_pinyins = array( => 'A', => 'B', => 'C', => 'D', => 'E', => 'F', => 'G', => 'H', => 'J', => 'K', => 'L', => 'M', => 'N', => 'O', => 'P', => 'Q', => 'R', => 'S', => 'T', => 'W', => 'X', => 'Y', => 'Z', ??? ); ??? private $_charset = null; ??? /** ???? * 构造函数,指定需要的编码 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,2); ??????????????? } ??????????????? else ??????????????? { ??????????????????? $result .= substr($str,1); ??????????????? } ??????????? } ??????????? if (ord(substr($str,1)) > 129) ??????????? { ??????????????? $i++; ??????????? } ??????? } ??????? return $result; ??? } ??? /** ???? * 字符串切分为数组 (汉字或者一个字符为单位) ???? * ???? * @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,1); ??????????????? $words[] = $word; ??????????????? $str = substr($str,strlen($word)); ??????????? } ??????? } ??????? return $words; ??? } ??? /** ???? * 判断字符是否是ascii字符 ???? * ???? * @param string $char ???? * @return bool ???? */ ??? private function _isAscii($char) ??? { ??????? return ( ord(substr($char,1)) < 160 ); ??? } ??? /** ???? * 判断字符串前3个字符是否是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,1)) * 1000 + ord(substr($word,1,1)); ??????????? /* 获取拼音首字母A--Z */ ??????????? if (($i = $this->_search($code)) != -1) ??????????? { ??????????????? $result[] = $this->_pinyins[$i]; ??????????? } ??????? } ??????? return strtoupper(implode('',$result)); ??? } ??? /** ???? *? 20140624 wangtianbao 获取首字母 ???? *? @param string $str ???? *? @return string ???? */ ??? public function getFirstString($str) ??? { ??????? //先把中文转换成字母 ??????? $new_string = $this->getInitials($str); ??????? if (empty($new_string)) ??????? { ??????????? return ''; ??????? } ??????? else ??????? { ??????????? return strtoupper(substr($new_string,1)); ??????? } ??? } ??? private function _getChar($ascii) ??? { ??????? if ($ascii >= 48 && $ascii <= 57) ??????? { ??????????? return chr($ascii);? /* 数字 */ ??????? } ??????? elseif ($ascii >= 65 && $ascii <= 90) ??????? { ??????????? return chr($ascii);?? /* A--Z */ ??????? } ??????? elseif ($ascii >= 97 && $ascii <= 122) ??????? { ??????????? return chr($ascii - 32); /* a--z */ ??????? } ??????? else ??????? { ??????????? return '-'; /* 其他 */ ??????? } ??? } ??? /** ???? * 查找需要的汉字内码(gb2312) 对应的拼音字符( 二分法 ) ???? * ???? * @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; ??????????? } ??????? } ??? } } 取汉字首字母算是目前几乎没个项目中都需要用到的功能了,这里给大家推荐的是效率比较高的代码,也是在本人项目中使用的,小伙伴们如发现问题,还请留言,大家共同进步PHP编程 欢迎参与《PHP实战:分享一段PHP制作的中文拼音首字母工具类》讨论,分享您的想法,编程之家 52php.cn为您提供专业教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |