PHP транслитерация

Существуют ли решения, которые преобразуют все иностранные символы в эквиваленты Az? Я много искал в Google и не мог найти решение или даже список символов и эквивалентов. Причина в том, что я хочу отображать только URL-адреса Az, а также множество других всплывающих подсказок при работе с этими символами.

9 ответов

Решение

Вы можете использовать iconv, который имеет специальную кодировку транслитерации.

Когда строка "//TRANSLIT" добавляется в код, транслитерация активируется. Это означает, что, когда символ не может быть представлен в целевом наборе символов, он может быть аппроксимирован одним или несколькими символами, которые похожи на исходный символ.

- http://www.gnu.org/software/libiconv/documentation/libiconv/iconv_open.3.html

Смотрите здесь полный пример, который соответствует вашему варианту использования.

Если вы используете iconv, убедитесь, что ваш языковой стандарт задан правильно, прежде чем пытаться транслитерировать, иначе некоторые символы не будут правильно транслитерированы.

setlocale(LC_CTYPE, 'en_US.UTF8');

Это преобразует как можно больше иностранных символов (включая кириллицу, китайский, арабский и т. Д.) В их эквиваленты Az:

$AzString = transliterator_transliterate('Any-Latin;Latin-ASCII;', $foreignString);

Возможно, вы захотите сначала установить расширение PHP Intl.

Если вы застряли в среде разработки и выпуска, которая не поддерживает PHP 5.4 или новее, вам следует использовать iconv или пользовательскую библиотеку транслитерации.

В случае iconv, я считаю, что это крайне бесполезно, особенно при использовании арабского или кириллического алфавита. Я бы выбрал встроенный класс транслитерации PHP 5.4 или пользовательский класс транслитерации.

В одном из опубликованных решений упоминалась пользовательская библиотека, которую я не тестировал.

Когда я использовал Drupal, мне понравился их модуль транслитерации, который я недавно портировал, чтобы сделать его пригодным для использования без Drupal.


Вы можете скачать его здесь и использовать следующим образом:

<?php

include "JTransliteration.php";

$mombojombotext = "誓曰:『時日害喪?予及女偕亡。』民欲與之偕亡,雖有";
$nonmombojombotex = JTransliteration::transliterate($mombojombotext);

echo $nonmombojombotex;

?>

Примечание: я делаю это из другого похожего вопроса в надежде, что это будет полезно для других.

В итоге я написал библиотеку PHP на основе URLify.js из проекта Django, так как я обнаружил, что iconv() слишком неполная. Вы можете найти это здесь:

https://github.com/jbroadway/urlify

Обрабатывает латинские символы, а также греческий, турецкий, русский, украинский, чешский, польский и латышский.

<?php
/**
 * @author bulforce[]gmail.com # 2011
 * Simple class to attempt transliteration of bulgarian lating text into bulgarian cyrilic text
 */

// Usage:
// $text = "yagoda i yundola";
// $tl = new Transliterate();
// echo $tl->lat_to_cyr($text); //ягода и юндола

class Transliterate {

    private $cyr_identical = array("а", "б", "в", "в", "г", "д", "е", "ж", "з", "и", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ъ", "я");
    private $lat_identical = array("a", "b", "v", "w", "g", "d", "e", "j", "z", "i", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "c", "y", "q");
    private $cyr_fricative = array("ж", "ч", "ш", "щ", "ц", "я", "ю", "я", "ю");    
    private $lat_fricative = array("zh", "ch", "sh", "sht", "ts", "ia", "iu", "ya", "yu");

    public function __construct() {
        $this->identical_to_upper();
        $this->fricative_to_variants();
    }

    public function lat_to_cyr($str) {

        for ($i = 0; $i < count($this->cyr_fricative); $i++) {
            $c_cyr = $this->cyr_fricative[$i];
            $c_lat = $this->lat_fricative[$i];
            $str = str_replace($c_lat, $c_cyr, $str);
        }

        for ($i = 0; $i < count($this->cyr_identical); $i++) {
            $c_cyr = $this->cyr_identical[$i];
            $c_lat = $this->lat_identical[$i];
            $str = str_replace($c_lat, $c_cyr, $str);
        }

        return $str;
    }

    private function identical_to_upper() {

        foreach ($this->cyr_identical as $k => $v) {
            $this->cyr_identical[] = mb_strtoupper($v, 'UTF-8');
        }

        foreach ($this->lat_identical as $k => $v) {
            $this->lat_identical[] = mb_strtoupper($v, 'UTF-8');
        }
    }

    private function fricative_to_variants() {
        foreach ($this->lat_fricative as $k => $v) {
            // This handles all chars to Upper
            $this->lat_fricative[] = mb_strtoupper($v, 'UTF-8');
            $this->cyr_fricative[] = mb_strtoupper($this->cyr_fricative[$k], 'UTF-8');

            // This handles variants
            // TODO: fix the 3 leter sounds
            for ($i = 0; $i <= count($v); $i++) {
                $v[$i] = mb_strtoupper($v[$i], 'UTF-8');
                $this->lat_fricative[] = $v;
                if ($i == 0) {
                    $this->cyr_fricative[] = mb_strtoupper($this->cyr_fricative[$k], 'UTF-8');
                } else {
                    $this->cyr_fricative[] = $this->cyr_fricative[$k];
                }
                $v[$i] = mb_strtolower($v[$i], 'UTF-8');
            }
        }
    }

}

Попробуй это

function Unaccent( $string ) {

$transliterator = Transliterator::createFromRules(':: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);

$normalized = $transliterator->transliterate($string);

return $normalized;

}

Для композитора адептов есть слизняк

https://github.com/cocur/slugify

use Cocur\Slugify\Slugify;
$slugify = new Slugify();
echo $slugify->slugify('Hello World!'); // hello-world

//You can also change the separator used by Slugify:
echo $slugify->slugify('Hello World!', '_'); // hello_world

//The library also contains Cocur\Slugify\SlugifyInterface. Use this interface whenever you need to type hint an instance of Slugify.
//To add additional transliteration rules you can use the addRule() method.
$slugify->addRule('i', 'ey');
echo $slugify->slugify('Hi'); // hey

Проблема с вашим запросом в том, что это очень сложно сделать. Не все глифы в большинстве языков имеют аз-эквиваленты, все глифы имеют фонетические эквиваленты (но это слова, а не буквы), если вы имеете дело только с латинскими языками, тогда все немного проще, но у вас все еще есть проблемы с такими вещами, как I-мутация,

Лучшее слово для решения проблемы - составить грубый список фонетических звуков -> эквивалентов az, он не будет идеальным, но без дополнительной информации о ваших точных требованиях трудно разработать решение.

Хорошая библиотека найдена по адресу:

1) https://github.com/ashtokalo/php-translit (однако во многих языках не хватает некоторых языков)

2) https://github.com/fre5h/transliteration (только для русского и украинского языков)

Другие вопросы по тегам