it-swarm.dev

PHP: Substitua os trema com o mais próximo de 7 bits ASCII equivalente em uma string UTF-8

O que eu quero fazer é remover todos os acentos e trema de uma string, transformando "lärm" em "larm" ou "andré" em "andre". O que eu tentei fazer foi utf8_decode a string e depois usar strtr nela, mas como meu arquivo de origem é salvo como arquivo UTF-8, não consigo inserir os caracteres ISO-8859-15 para todos os umlauts - o editor insere o caractere Caracteres UTF-8.

Obviamente, uma solução para isso seria ter uma inclusão que é um arquivo ISO-8859-15, mas deve haver uma maneira melhor do que ter outra necessária incluir?

echo strtr(utf8_decode($input), 
           'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ',
           'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');

UPDATE: Talvez eu tenha sido um pouco impreciso com o que eu tento fazer: Eu realmente não quero remover o umlauts, mas substituí-los com o seu mais próximo "um caractere ASCII" equivalente.

40
BlaM
iconv("utf-8","ascii//TRANSLIT",$input);

Estendido exemplo

51
Vinko Vrsalovic

Um pequeno truque que não requer configuração de localidades ou tabelas de tradução enormes:

function Unaccent($string)
{
    if (strpos($string = htmlentities($string, ENT_QUOTES, 'UTF-8'), '&') !== false)
    {
        $string = html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|Grave|lig|orn|ring|slash|tilde|uml);~i', '$1', $string), ENT_QUOTES, 'UTF-8');
    }

    return $string;
}

O único requisito para que funcione corretamente é salvar seus arquivos em UTF-8 (como você já deve).

26
Alix Axel

você também pode tentar isso

$string = "Fóø Bår";
$transliterator = Transliterator::createFromRules(':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: Lower(); :: NFC;', Transliterator::FORWARD);
echo $normalized = $transliterator->transliterate($string);

mas você precisa ter http://php.net/manual/en/book.intl.php available

5
gabo

Ok, encontrei uma solução óbvia, mas não é o melhor em termos de desempenho ...

echo strtr(utf8_decode($input), 
           utf8_decode('ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
           'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
0
BlaM

Para usuários árabes e persas, eu recomendo esta maneira de remover diacríticos:

    $diacritics = array('َ','ِ','ً','ٌ','ٍ','ّ','ْ','ـ');
    $search_txt = str_replace($diacritics, '', $diacritics);

Para digitar diacríticos em teclados árabes você pode usar os códigos Asci (aqueles códigos não são Unicode) nos editores do Windows Digitando sinais diacríticos diretamente ou segurando Alt + (digite o código do caractere diacrítico) os códigos

ـَ (0243) ـِ (0246) ـُ (0245) ـً (0240) ـٍ (0242) ـٌ (0241) ـْ (0250) ـّ (0248) ـ ـ (0220)

0
ganji

Descobri que este fornece os resultados mais consistentes em francês e alemão. Com a metatag definida como utf-8, coloquei em uma função para retornar uma linha de uma matriz de palavras e funciona perfeitamente.

htmlentities (  $line, ENT_SUBSTITUTE   , 'utf-8' ) 
0
jay

Se você estiver usando o WordPress, você pode usar a função interna remove_accents( $string )

https://codex.wordpress.org/Function_Reference/remove_accents

No entanto, notei um erro: ele não funciona em uma string com um único caractere.

0
youtag