实现思路:根据 汉语拼音单韵母 做为对照表实现 ,?代码如下
if (!function_exists('remove_tone')) {
/**
* 移除拼音中的声调
* Author:刘星麟
* @param string $txt 单个拼音 如:liú
* @param bool $tone_true 是否返回音调 默认false 返回字符串 true 返回数组 ['py' => '拼音', 'tone'=> '声调'] 0:平生 1:一声 2:二声 3:三声 4:四声
* @return mixed|string|string[]
*/
function remove_tone(string $txt = '', bool $tone_true = false)
{
if (empty($txt)) return $txt;
$py = array(
'ā'=>'a',
'á'=>'a',
'ǎ'=>'a',
'à'=>'a',
'ē'=>'e',
'é'=>'e',
'ě'=>'e',
'è'=>'e',
'ī'=>'i',
'í'=>'i',
'ǐ'=>'i',
'ì'=>'i',
'ō'=>'o',
'ó'=>'o',
'ǒ'=>'o',
'ò'=>'o',
'ū'=>'u',
'ú'=>'u',
'ǔ'=>'u',
'ù'=>'u',
'ǖ'=>'v',
'ǘ'=>'v',
'ǚ'=>'v',
'ǜ'=>'v',
);
$toneArr = array_keys($py);
if (is_string($txt)) {
$len = mb_strlen($txt);
$toneNum = 0;
for ($i = 0; $i < $len; $i++) {
$str = mb_substr($txt, $i, 1);
$find = array_search($str, $toneArr);
if ($find !== false) {
$txt = str_replace($str, $py[$str], $txt);
$tone = ($find + 1) % 4; //取声调
$toneNum = $tone == 0 ? 4 : $tone; //特殊处理四声调
break;
}
}
if ($tone_true === true) {
return ['py' => $txt, 'tone' => $toneNum];
}
}
return $txt;
}
}
如果想直接移除拼音中的声调,上面的方法可以精简一下
if (!function_exists('remove_tone')) {
/**
* 移除拼音中的声调
* Author:刘星麟
* @param string $txt 拼音
* @return string
*/
function remove_tone(string $txt = '')
{
if (empty($txt)) return $txt;
$py = array(
'ā'=>'a',
'á'=>'a',
'ǎ'=>'a',
'à'=>'a',
'ē'=>'e',
'é'=>'e',
'ě'=>'e',
'è'=>'e',
'ī'=>'i',
'í'=>'i',
'ǐ'=>'i',
'ì'=>'i',
'ō'=>'o',
'ó'=>'o',
'ǒ'=>'o',
'ò'=>'o',
'ū'=>'u',
'ú'=>'u',
'ǔ'=>'u',
'ù'=>'u',
'ǖ'=>'v',
'ǘ'=>'v',
'ǚ'=>'v',
'ǜ'=>'v',
);
return str_replace(array_keys($py), array_values($py), $txt);
}
}
|