Jak elegantně zbavit text diakritiky?
- Rellik
- Člen | 104
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
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
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 :-(
- Rellik
- Člen | 104
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)
- saimons
- Člen | 293
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
@**saimons**: a vždycky se můžeš přijít zeptat na #nette jabber chat, když nevíš co hledáš ;)