PinYin.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. namespace app\expand\controller;
  3. use app\common\service\HelperService;
  4. use think\Validate;
  5. /**
  6. * 汉字转拼音接口
  7. * Class PinYin
  8. * @package app\expand\controller
  9. */
  10. class PinYin extends BaseAuth
  11. {
  12. private $_Account = null;
  13. public function __construct(){
  14. parent::__construct();
  15. $this->_Account = $this->getKey($this->_apiCode);
  16. //验证是否具有访问这个接口的权限
  17. if(!isset($this->_Account['PinYin'])){
  18. HelperService::returnJson(['code'=>400,'msg'=>'pinyin unauthorized access','data'=>[]]);
  19. }
  20. }
  21. /**
  22. * 将汉字翻译成拼音
  23. */
  24. public function transChinese(){
  25. $params = $this->_params;
  26. $rule = [
  27. 'old_string|待翻译参数'=>'require',
  28. 'is_first_word|是否仅需要首字母'=>'require'
  29. ];
  30. $validate = new Validate($rule);
  31. if(!$validate->check($params)){
  32. HelperService::returnJson(['code'=>400,'msg'=>$validate->getError(),'data'=>$params]);
  33. }
  34. $pinYin = $this->trans($params['old_string'],$this->pinYin());
  35. HelperService::returnJson(['code'=>200,'msg'=>'success','data'=>$pinYin]);
  36. }
  37. /**
  38. * 转义
  39. * @param type $oldStr
  40. * @param type $pinYinArr
  41. * @param type $isFirstWord 是否只需要第一个字母
  42. * @return string
  43. */
  44. private function trans($oldStr='',$pinYinArr=[],$isFirstWord=false) {
  45. $con = $this->mbStrSplit($oldStr);
  46. $str = '';
  47. for ($i=0;$i<count($con);$i++) {
  48. if (isset($pinYinArr[$con[$i]]) && $this->charCodeAt($con[$i]) > 200){
  49. $str .= $isFirstWord? strtoupper($pinYinArr[$con[$i]][0]):$pinYinArr[$con[$i]];
  50. }else {
  51. $str .= $isFirstWord?strtoupper($con[$i][0]):$con[$i];
  52. }
  53. $str .= $isFirstWord?'':' ';
  54. }
  55. return $str;
  56. }
  57. /**
  58. * 获取字符编码值
  59. * @param $char
  60. * @return null|number
  61. */
  62. private function charCodeAt($char)
  63. {
  64. if (mb_check_encoding($char, 'UTF-8'))
  65. {
  66. $ret = mb_convert_encoding($char, 'UTF-32BE', 'UTF-8');
  67. return hexdec(bin2hex($ret));
  68. }
  69. else
  70. {
  71. return null;
  72. }
  73. }
  74. /**
  75. * 拆分中英文
  76. * @param $str
  77. * @return array
  78. */
  79. private function mbStrSplit($str){
  80. return preg_split('/(?<!^)(?!$)/u', $str);
  81. }
  82. /**
  83. * 获取拼音大全
  84. * @return mixed
  85. */
  86. private function pinYin(){
  87. $pyDic = file_get_contents('pingyin.json');
  88. $returnArr = json_decode($pyDic,true);
  89. return $returnArr;
  90. }
  91. }