Pinyin.php 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. <?php
  2. namespace app\common\util;
  3. class Pinyin
  4. {
  5. private static $pinyins = null;
  6. public function __construct() {
  7. }
  8. public static function get($str, $ret_format = 'all', $placeholder = '', $allow_chars = '/[a-zA-Z\d ]/') {
  9. if (null === self::$pinyins) {
  10. $data = file_get_contents('./static/data/pinyin.dat');
  11. $rows = explode('|', $data);
  12. self::$pinyins = array();
  13. foreach($rows as $v) {
  14. list($py, $vals) = explode(':', $v);
  15. $chars = explode(',', $vals);
  16. foreach ($chars as $char) {
  17. self::$pinyins[$char] = $py;
  18. }
  19. }
  20. }
  21. $str = trim($str);
  22. $len = mb_strlen($str, 'UTF-8');
  23. $rs = '';
  24. for ($i = 0; $i < $len; $i++) {
  25. $chr = mb_substr($str, $i, 1, 'UTF-8');
  26. $asc = ord($chr);
  27. if ($asc < 0x80) { // 0-127
  28. if (preg_match($allow_chars, $chr)) { // 用参数控制正则
  29. $rs .= $chr; // 0-9 a-z A-Z 空格
  30. } else { // 其他字符用填充符代替
  31. $rs .= $placeholder;
  32. }
  33. } else { // 128-255
  34. if (isset(self::$pinyins[$chr])) {
  35. $rs .= 'first' === $ret_format ? self::$pinyins[$chr][0] : (self::$pinyins[$chr] . '');
  36. } else {
  37. $rs .= $placeholder;
  38. }
  39. }
  40. if ('one' === $ret_format && '' !== $rs) {
  41. return $rs[0];
  42. }
  43. }
  44. $rs = str_replace([' ','+','/','\\','|','\'','?','%','#','&','=','!','(',')',';',':','<','>'],'',$rs);
  45. return $rs;
  46. }
  47. }