特殊条件下的PHP array_replace(高级音译)

时间:2016-11-05 10:49:45

标签: php arrays

我正在尝试编辑音译功能以满足特殊条件。我使用俄语进行拉丁语音译,我已经改编为保加利亚语,但有一个特殊情况,即如果字母“я”,通常音译为“ya”,则在一个单词的末尾找到,并且如果之前是字母“и”,它被音译为“a”。

示例:没有特殊情况,“мистерия”被音译为“misteriya”,而正确的音译(根据保加利亚音译法)是“misteria”。

我尝试了什么:

  1. 将源字符串拆分为单词。
  2. 检查单词是否超过2个字符。
  3. 检查最后一个字母是否为“я”。
  4. 检查前面的字母是否为“и”。
  5. 如果满足上述所有条件,请将转换图表数组中“я”和“Я”(小写和大写)的值替换为新值。
  6. 将所有转换的单词连接成一个字符串并输出。
  7. 不起作用。

    function transliterator($string) {
    $converter = array(
    'а' => 'a',   'б' => 'b',   'в' => 'v',
    'г' => 'g',   'д' => 'd',   'е' => 'e',
    'ж' => 'zh',  'з' => 'z',   'и' => 'i',
    'й' => 'y',   'к' => 'k',   'л' => 'l',
    'м' => 'm',   'н' => 'n',   'о' => 'o',
    'п' => 'p',   'р' => 'r',   'с' => 's',
    'т' => 't',   'у' => 'u',   'ф' => 'f',
    'х' => 'h',   'ц' => 'ts',  'ч' => 'ch',
    'ш' => 'sh',  'щ' => 'sht', 'ь' => '',
    'ъ' => 'a',   'ю' => 'yu',  'я' => 'ya',
    
    'А' => 'A',   'Б' => 'B',   'В' => 'V',
    'Г' => 'G',   'Д' => 'D',   'Е' => 'E',
    'Ж' => 'Zh',  'З' => 'Z',   'И' => 'I',   
    'Й' => 'Y',   'К' => 'K',   'Л' => 'L',   
    'М' => 'M',   'Н' => 'N',   'О' => 'O',   
    'П' => 'P',   'Р' => 'R',   'С' => 'S',   
    'Т' => 'T',   'У' => 'U',   'Ф' => 'F',
    'Х' => 'H',   'Ц' => 'Ts',  'Ч' => 'Ch',
    'Ш' => 'Sh',  'Щ' => 'Sht', 'Ь' => '',
    'Ъ' => 'A',   'Ю' => 'Yu',  'Я' => 'Ya',
    );
    
    $words = explode(" ", $string);
    $trans_string = "";
    foreach($words as $word) {
    
    if((strlen($word > 2)) && (strpos($word, "я", -1)) && (strpos($word, "и", -2))) {
        $amend = array("я" => "a", "Я" => "A");
        $converter = array_replace($converter, $amend);
    }
    $trans_word = strtr($word, $converter);
    $trans_string .= $trans_word." ";
    
    }
    return $trans_string;
    }
    
  8. 请帮忙吗?

1 个答案:

答案 0 :(得分:2)

问题是strposstrtr不提供多字节支持。对于strpos,您可以使用mb_strpos解决此问题,甚至可以更好地将条件重写为(mb_subtr($word, -2) == 'ия')

但是,您仍然会遇到其他功能问题。我建议改用preg_replace_callback;使用/u修饰符,您将获得多字节支持:

function transliterator($string) {
    return preg_replace_callback('/ия\b|./uis', function ($c) {
        $converter = array(
        'а' => 'a',   'б' => 'b',   'в' => 'v',
        'г' => 'g',   'д' => 'd',   'е' => 'e',
        'ж' => 'zh',  'з' => 'z',   'и' => 'i',
        'й' => 'y',   'к' => 'k',   'л' => 'l',
        'м' => 'm',   'н' => 'n',   'о' => 'o',
        'п' => 'p',   'р' => 'r',   'с' => 's',
        'т' => 't',   'у' => 'u',   'ф' => 'f',
        'х' => 'h',   'ц' => 'ts',  'ч' => 'ch',
        'ш' => 'sh',  'щ' => 'sht', 'ь' => '',
        'ъ' => 'a',   'ю' => 'yu',  'я' => 'ya',

        'А' => 'A',   'Б' => 'B',   'В' => 'V',
        'Г' => 'G',   'Д' => 'D',   'Е' => 'E',
        'Ж' => 'Zh',  'З' => 'Z',   'И' => 'I',   
        'Й' => 'Y',   'К' => 'K',   'Л' => 'L',   
        'М' => 'M',   'Н' => 'N',   'О' => 'O',   
        'П' => 'P',   'Р' => 'R',   'С' => 'S',   
        'Т' => 'T',   'У' => 'U',   'Ф' => 'F',
        'Х' => 'H',   'Ц' => 'Ts',  'Ч' => 'Ch',
        'Ш' => 'Sh',  'Щ' => 'Sht', 'Ь' => '',
        'Ъ' => 'A',   'Ю' => 'Yu',  'Я' => 'Ya',

        'ия' => 'ia', 'ИЯ' => 'IA' // add this!
        );  
        $c = reset($c); // we just need the first element of that array
        return isset($converter[$c]) ? $converter[$c] : $c;
    }, $string);
}