1

我正在尝试编写一个脚本,该脚本将查看字符串是否具有特定的变音符号,并将其转换为不同的音译方案。(两者都是梵文的音译方案)。

这是我的代码。

$first = $_POST["first"];
$second = $_POST['second'];
$iast = array("a","A","ā","Ā","i","I","ī","Ī","u","U","ū","Ū","ṛ","Ṛ","ṝ","Ṝ","ḷ","Ḷ","ḹ","Ḹ","e","E","ai","Ai","o","O","au","Au","ṃ","Ṃ","ḥ","Ḥ","k","K","c","C","ṭ","Ṭ","t","T","p","P","kh","Kh","ch","Ch","ṭh","Ṭh","th","Th","ph","Ph","g","G","j","J","ḍ","Ḍ","d","D","b","B","gh","Gh","jh","Jh","ḍh","Ḍh","dh","Dh","bh","Bh","ṅ","Ṅ","ñ","Ñ","ṇ","Ṇ","n","N","m","M","y","Y","r","R","l","L","v","V","ś","Ś","ṣ","Ṣ","s","S","h","H");
$slp  = array("a","a","A","A","i","i","I","I","u","u","U","U","f","f","F","F","x","x","X","X","e","e","E", "E", "o","o","O", "O", "M","M","H","H","k","k","c","c","w","w","t","t","p","p","K", "K", "C", "C", "W", "W", "T", "T", "P", "P", "g","g","j","j","q","q","d","d","b","b","G", "G", "J", "J", "Q", "Q", "D", "D", "B", "B", "N","N","Y","Y","R","R","n","n","m","m","y","Y","r","r","l","l","v","v","S","S","z","z","s","s","h","h");

if (preg_match('/[āĀīĪūŪṛṚṝṜḷḶḹḸṃṂḥḤṭṬḍḌṅṄñÑṇṆśŚṣṢV]/',$first) || preg_match('/[āĀīĪūŪṛṚṝṜḷḶḹḸṃṂḥḤṭṬḍḌṅṄñÑṇṆśŚṣṢV]/',$second))
{
    $first = str_replace($iast,$slp,$first);
    $second = str_replace($iast,$slp,$second);
}

我将 HTML 中的 $first 和 $second 都作为用户输入。

问题:当我输入 $first="dhātṛ"; 和 $second = "aṃśaḥ"; 输出为“DAtf”+“amsah”。从数组中可以看出,所需的输出为“DAtf”+“aMSaH”。

我仍然无法看到它如何识别 ṛ 并将其正确转换为 f ?并且不能分别替换 m 和 h -> M 和 H 下面的点。

4

1 回答 1

0

问题在于您的翻译数组的顺序。str_replace()使用愚蠢的算法:从两个数组中的第一个值开始,用替换数组中的匹配值替换搜索数组中的每个找到的字符。

在某些时候,“ṃ”被替换为大写“M”。稍后您将大写“M”替换为小写“m”。因为str_replace()不记得这个 M 实际上是一个替换的“ṃ”,所以它确实再次转换了它。

您可以通过重新排列替换阵列来摆脱这种情况。如果你先翻译“easy”字母,然后再翻译变音字母,你可能会避开这个陷阱。通过将“m”和“M”的翻译移动到数组的前面,我成功地测试了该“ṃ”的正确翻译。

另一方面,您可能不想开始重新排列数组中的值并检查 str_replace() 是否实际上对一个字符起作用两次。算法必须只分析每个字符一次并将其翻译成适当的音译。strtr()似乎是可以做到这一点的 PHP 函数,但不幸的是它只能用于单字节编码。并且没有mb_strtr()可用的功能。

于 2013-11-09T11:49:11.020 回答