2016-11-05 4 views
1

Ich versuche, eine Transliterationsfunktion zu bearbeiten, um eine spezielle Bedingung zu erfüllen. Ich benutze ein Russisch in Latein Transliteration, die ich für Bulgarisch angepasst habe, aber es gibt die besondere Bedingung, dass, wenn der Buchstabe "я", normalerweise als "ya" transkribiert, am Ende eines Wortes gefunden wird, und wenn der Buchstabe "Ø", wird es als "a" transkribiert.PHP array_replace auf speziellen Zustand (erweiterte Transliteration)

Beispiel: Ohne die besondere Bedingung wird "мистерия" als "misteriya" transkribiert, während die korrekte Transliteration (nach dem bulgarischen Transliterationsgesetz) "misteria" ist.

Was ich versucht habe:

  1. Split die Quellzeichenfolge in Worte zu fassen.
  2. Überprüfen Sie, ob das Wort länger als 2 Zeichen ist.
  3. Überprüfen Sie, ob der letzte Buchstabe "я" ist.
  4. Überprüfen Sie, ob der Buchstabe davor "Ø" ist.
  5. Wenn alle oben genannten Bedingungen erfüllt sind, ersetzen Sie die Werte für "я" und "Я" (Groß- und Kleinbuchstaben) im Umwandlungsdiagramm-Array durch ihre neuen Werte.
  6. Verketten Sie alle konvertierten Wörter in eine Zeichenfolge und geben Sie sie aus.
  7. Es funktioniert nicht.

    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; 
    } 
    

Einige bitte helfen?

+0

zeigen den Eingang '$ string' Inhalt – RomanPerekhrest

+0

ich würde' substr ($ Wort, -2) == ‚ия'' statt' strpos'. konnte es aber wegen Zeichensatz wahrscheinlich nicht zum Laufen bringen. – RST

+0

Es ist nicht die array_merge, die nicht funktioniert, es ist die if-Bedingung – RST

Antwort

2

Das Problem ist, dass strpos und strtr bieten keine Multibyte-Unterstützung. Für strpos können Sie dies beheben, indem Sie mb_strpos verwenden oder den Zustand besser als (mb_subtr($word, -2) == 'ия') umschreiben.

Noch haben Sie Probleme mit dem Rest der Funktion. Ich würde vorschlagen, stattdessen preg_replace_callback zu verwenden; mit dem /u Modifikator werden Sie multibyte Unterstützung haben:

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); 
} 
+0

Nur ein kleines Problem entdeckt. Wenn der Text Großbuchstaben ist, funktioniert die Konvertierung nicht ordnungsgemäß. Ich habe versucht, die Großbuchstabe der Kombination ('ИЯ' => 'IA') zu addieren, aber Wörter, die in Großbuchstaben geschrieben sind und "ИЯ" haben, werden in "IYA" umgewandelt. – cheeseus

+0

Sie müssen dies auch im regulären Ausdruck hinzufügen, indem Sie die Groß-/Kleinschreibung nicht beachten: Fügen Sie den Modifizierer "i" hinzu. Ich habe die Antwort entsprechend aktualisiert. Ich habe auch den 's' Modifier hinzugefügt, um Mutliline-Eingaben zu unterstützen. – trincot