|
- <?php
-
- namespace Kuxin\Helper;
-
- use Kuxin\Config;
-
- /**
- * Class Pinyin
- *
- * @package Kuxin\Helper
- * @author Pakey <pakey@qq.com>
- */
- class Pinyin
- {
-
- protected static $data = null;
-
- /**
- * @return mixed
- */
- protected static function getdata()
- {
- if (self::$data === null) {
- $fp = fopen(__DIR__ . '/data/pinyin.dat', 'r') or exit('读取字典失败');
- while (!feof($fp)) {
- $line = trim(fgets($fp));
- self::$data[$line[0] . $line[1]] = substr($line, 3, strlen($line) - 3);
- }
- fclose($fp);
- }
- return self::$data;
- }
-
- /**
- * 转换成拼音
- *
- * @param string $str 待转换的字符串
- * @param bool $isfirst 是否只需要首字符
- * @param string $default 匹配不到默认显示字符
- * @return string
- */
- public static function change(string $str, $isfirst = null, $default = '_')
- {
- $str = iconv('UTF-8', 'GBK//ignore', $str);
- $isfirst = $isfirst === null ? (Config::get('pinyin.ucfirst', 1)) : $isfirst;
- $data = self::getdata();
- $restr = '';
- for ($i = 0, $j = strlen($str); $i < $j; $i++) {
- if (ord($str[$i]) > 0x80) {
- $c = $str[$i] . $str[$i + 1];
- ++$i;
- if (isset($data[$c])) {
- $restr .= $isfirst ? ucfirst($data[$c]) : $data[$c];
- } else {
- $restr .= $default;
- }
- } elseif (preg_match("/[\w\-]/i", $str[$i])) {
- $restr .= $str[$i];
- } else {
- $restr .= $default;
- }
- }
- return $restr;
- }
- }
|