Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

setlocale(LC_CTYPE, 'en_US.UTF8');

Ответ 3

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

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

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

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


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

<?php

include "JTransliteration.php";

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

echo $nonmombojombotex;

?>

Ответ 4

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

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

https://github.com/jbroadway/urlify

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

Ответ 5

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

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

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

Ответ 6

<?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');
            }
        }
    }

}

Ответ 7

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

Самое лучшее слово для решения - составить сырой список фонетических звуков → a-z эквивалентов, он не будет идеальным, но без дополнительной информации о ваших точных требованиях сложно разработать решение.

Ответ 8

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

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