分享一段PHP制作的中文拼音首字母工具类
程序员文章站
2022-06-11 16:12:19
代码很简单,这里就不多bb了,大家看注释吧,注释都看不懂的小伙伴,求放过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, $i, 2);
}
else
{
$result .= substr($str, $i, 1);
}
}
if (ord(substr($str, $i, 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, 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个字符是否是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));
}
/**
* 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, 0, 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;
}
}
}
}
代码很简单,这里就不多bb了,大家看注释吧,注释都看不懂的小伙伴,求放过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, $i, 2);
}
else
{
$result .= substr($str, $i, 1);
}
}
if (ord(substr($str, $i, 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, 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个字符是否是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));
}
/**
* 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, 0, 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;
}
}
}
}
取汉字首字母算是目前几乎没个项目中都需要用到的功能了,这里给大家推荐的是效率比较高的代码,也是在本人项目中使用的,小伙伴们如发现问题,还请留言,大家共同进步
下一篇: go Casbin配置文件,以及匹配规则