php判断汉子首字母的函数,php获取汉字首字母的函数

本文介绍用php实现汉字转化为首字母的方法,主要功能是:功能明确,易于修改维护和扩展; 英文的字串:不变返回(包括数字);中文字符串:返回拼音首字符; 中英混合串: 返回拼音首字符和英文。

网上的方法有不少,都是一样的原理,按照需求,做了一下版本的class类文件,主要功能是:功能明确,易于修改维护和扩展; 英文的字串:不变返回(包括数字);中文字符串:返回拼音首字符; 中英混合串: 返回拼音首字符和英文。该算法采用了二分法查找,修复了之前字母Z读取成Y的错误。好东西要收藏,故在此留下印记,以供后人考证!

复制代码代码如下:

/**

* Modified by http://iulog.com @ 2013-05-07

* 修复二分法查找方法

* 汉字拼音首字母工具类

*  注: 英文的字串:不变返回(包括数字)    eg .abc123 => abc123

*      中文字符串:返回拼音首字符        eg. 测试字符串 => CSZFC

*      中英混合串: 返回拼音首字符和英文   eg. 我i我j => WIWJ

*  eg. www.jbxue.com

*  $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;

/**

* 构造函数, 指定需要的编码 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));

}

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;

}

}

}

}

?>

JS获取汉字首字母

//获取 汉字首字母 function makePy(str) { if (typeof (str) != "string") throw new Error(-1, " ...

ASP&period;NET获取汉字首字母

/// /// 获取汉字首字母(可包含多个汉字) /// ///

php获取汉字首字母

php获取汉字首字母,可以用于按字母对数据进行检索排序等. 分享下网上找的代码.亲测有效. function getFirstCharter($str){ if(empty($str)){return ...

PHP获取中文首字母的函数

PHP获取中文首字母的函数 <?php header("Content-type: text/html; charset=utf-8"); function getFirst ...

JS实现获取汉字首字母拼音、全拼音及混拼音的方法

本文实例讲述了JS实现获取汉字首字母拼音.全拼音及混拼音的方法.分享给大家供大家参考,具体如下: 这里需要用到一个js获取汉字拼音的插件,可点击此处本站下载. 运行效果如下: 完整示例代码: ? 1 ...

&period;NET获取汉字首字母

/// /// 获取汉字首字母(可包含多个汉字) /// ///

PHP自定义函数获取汉字首字母的方法

使用场景:城市列表等根据首字母排序的场景 function getFirstCharter($str) { if (empty($str)) { return ''; } $fchar = ord($ ...

c&num;获取汉字首字母拼音

/* * 由SharpDevelop创建. * 用户: lenovo * 日期: 2013/10/22 * 时间: 20:15 * * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 */ ...

php获取汉字首字母实例

在我们实际开发工作中,有时候需要获取输入汉字的首字母,然后存到库中,方便用户搜索相关信息,下面给出php代码,留做备用: //新添加获取汉子首字,首字字母 function pinyin($zh){ ...

随机推荐

WebForm Repeater Response以及 地址栏

Repeater重复器: Repeater中有五个模板,这里需要注意的是4个 - 开头,只执行一次的内容 - 需 ...

LINUX运维实战案例之文件已删除但空间不释放问题的分析与解决办法

1.错误现象 运维的监控系统发来通知,报告一台服务器空间满了,登陆服务器查看,根分区确实没有空间了,如下图所示: 这里首先说明一下服务器的一些删除策略,由于Linux没有回收站功能,我们的线上服务器所 ...

【C语言入门教程】3&period;3 条件控制语句

在程序的 3 种基本结构中,第二种是选择结构,选择结构是根据程序运行时获得的条件,决定程序执行情况.条件控制语句可用来实现这种结构,C 语言提供了 if 语句和 switch 语句两种条件控制语句,i ...

psql-05数据库&comma;模式

数据的组织结构 数据库:表,索引:数据行 PostgreSQL中一个服务(实例)可以有多个数据库:而一个数据库不能属于多个实例; 数据库 创建数据库 create database name [own ...

leetcode 152&period; Maximum Product Subarray --------- java

Find the contiguous subarray within an array (containing at least one number) which has the largest ...

黄聪:wordpress自动选择上一篇文章选择的分类目录

有时候,我们需要连续发布同一个分类下的文章,每篇文章都要重新选择分类非常麻烦.下面,我们就用程序来搞定这个问题. add_action('publish_post', 'save_fl' ); add ...

encodeURI后台乱码&lpar;解决&rpar;

window.location.href = xxxx?a=encodeURI(encodeURI(name)) ; name是中文,页面部分需要编码两次 name = java.net.URLDec ...

微服务API Gateway

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值