Jak elegantně zbavit text diakritiky?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Rellik
Člen | 104
+
0
-

Tak tu máme nové téma zase nové téma :)
Bohužel se mi nepodařilo zjistit jak elegantně vyřešit převod textu z diakritiky na bezdiakritický. Funkce, kterou jsem doteď používal nějak nefunguje. Respektive funguje, ale místo stejného textu, jen bez háčků a čárek, vyplivne úplně něco jiného.

$text = ěščř;
$rename = strtr($text,"áčďéěíňóřšťúůýž ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽABCDEFGHIJKLMNOPRSTUVWXZ","acdeeinorstuuyz_acdeeinorstuuyzabcdefghijklmnoprstuvwxz");
// $rename  vyplivne "isveilvc"

Pročpak tomu tak je?? Je v nette nějaká funkce, která udělá z ěščř žýáíé text escr_zyaie ??

Michal Vyšinský
Člen | 608
+
0
-

Rellik napsal(a):
Je v nette nějaká funkce, která udělá z ěščř žýáíé text escr_zyaie ??

Ano je Nette\Utils\Strings (metoda webalize)

Editoval CherryBoss (11. 1. 2012 21:24)

Rellik
Člen | 104
+
0
-

Díky za odpověď. Našel sem si tu funkci tady na fóru. Funguje to parádně. Nicméně to pořád není ono. Chci to použít pro změnu názvu uploadovaného souboru. Když použiju funkci:

public static function webalize($s, $charlist = NULL, $lower = TRUE) {
    $s = strtr($s, '`\'"^~', '-----');
    if (ICONV_IMPL === 'glibc') {
        $s = @iconv('UTF-8', 'WINDOWS-1250//TRANSLIT', $s); // intentionally @
        $s = strtr($s, "\xa5\xa3\xbc\x8c\xa7\x8a\xaa\x8d\x8f\x8e\xaf\xb9\xb3\xbe\x9c\x9a\xba\x9d\x9f\x9e\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2"
                . "\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe", "ALLSSSSTZZZallssstzzzRAAAALCCCEEEEIIDDNNOOOOxRUUUUYTsraaaalccceeeeiiddnnooooruuuuyt");
    } else {
        $s = @iconv('UTF-8', 'ASCII//TRANSLIT', $s); // intentionally @
    }
    $s = str_replace(array('`', "'", '"', '^', '~'), '', $s);
    if ($lower)
        $s = strtolower($s);
    $s = preg_replace('#[^a-z0-9' . preg_quote($charlist, '#') . ']+#i', '-', $s);
    $s = trim($s, '-');
    return $s;
}

Tak to sice odstraní diakritiku a mezery, ale taky to odstraní příponu souboru. Respektive ji zahrne do názvu a ze souboru např čmelák.jpg to udělá cmelak-jpg. Diakritika sice zmizla, ale zmizela i přípona souboru, protože tu .jpg to převedlo na -jpg. Zkoušel sem zakomentovat 3 řádek od konce, kde to právě dělá ty – ale to zase nepřevede mezeru v názvu na – takže ze souboru čmelák v zimě.jpg to sice udělá cmelak v zime.jpg ale v názvu zůstanou mezery :-(

Melmen
Člen | 132
+
0
-

A co si název souboru rozdělit na název a na příponu, a pak použít webalize jen na název?

Rellik
Člen | 104
+
0
-

Už sem to vyřešil jinak… Ten řádek

$s = preg_replace('#[^a-z0-9' . preg_quote($charlist, '#') . ']+#i', '-', $s);

sem prostě změnil na:

$s = str_replace(' ', '_', $s);

A funguje to parádně… :) K ničemu jinému to nebude, tak snad to tak můžu nechat… :)
Takže díky za odpovědi..

Editoval Rellik (12. 1. 2012 18:03)

voda
Člen | 561
+
0
-

Kdybys využil i druhý parametr fuknce webalize tak nic nemusíš měnit.

saimons
Člen | 293
+
0
-

Jen takovej postreh k predchozimu. Cim dele pracuji s Nette tak zjistuji, ze je lepsi venovat mnohem vice casu studiu Dokumentace a API, nez si snazit neco sbastlit. Protoze ve finale to v pristich projektech usetri strasne moc casu. Obcas si rikam tahle funkce tady asi nebude, ale Nette me vzdy prijmene prekvapi ze to umi (clovek musi hledat v API), jen je potreba venovat cas hledanim a zkousenim.

Filip Procházka
Moderator | 4668
+
0
-

@**saimons**: a vždycky se můžeš přijít zeptat na #nette jabber chat, když nevíš co hledáš ;)