webdesign / development + awesome
Generovanie pekných URL
Pre SEO sú veľmi dôležité vhodne formátované URL adresy. Taká dobrá URL by mala obsahovať viac menej len text úzko súvisiaci s obsahom, avšak bez diakritiky a podobnej chamrade, aby nevznikali problémy pri kopírovaní linkov a parsovaní adries vyhľadávačmi.
Chamraď sa dá buď nahradiť URL entitami (%20
je napríklad medzera), čo môže byť pri niektorých znakoch stále nespoľahlivé alebo sa z nej dá odstrániť diakritika a zvyšok nahradiť pomlčkami.
Druhý spôsob sa nám najviac osvedčil a používame naň túto funkciu:
function seo_url($str) { $str = remove_accents($str); $str = preg_replace('/[^a-zA-Z0-9-]/', '-', $str); return strtolower(trim(preg_replace('/-+/', '-', $str), "-")); }
V prvom riadku sa odstáni z písmen diakritika:
Bŕm™ džžž DrÍST ブレイド!
-> Brm™ dzzz DrIST ブレイド!
v druhom riadku sa nahradia všetky znaky okrem písmen a číslic pomlčkami:
Brm--dzzz-DrIST------
a v treťom sa všetky susediace pomlčky spakujú do jednej, odstránia sa pomlčky z krajov a všetky písmená sa premenia na malé:
Brm-dzzz-DrIST-
-> Brm-dzzz-DrIST
-> brm-dzzz-drist
Funkcia remove_accents()
potom vyzerá nasledovne:
function remove_accents($str) { return str_replace ( array( 'à','á','â','ã','ä','å','æ','ç','ć','č','ď','đ','ð','è','é','ê','ë','ę','ě','ì','í','î','ï','ĺ','ľ','ł','ň','ñ','ò','ó','ô','õ','ö','ő','ø','ŕ','ř','ś','š','ß','ť','þ','ù','ú','û','ü','ű','ů','ý','ÿ','ž', 'À','Á','Â','Ã','Ä','Å','Æ','Ç','Ć','Č','Ď','Ð','È','É','Ê','Ë','Ę','Ě','Ì','Í','Î','Ï','Ĺ','Ľ','Ł','Ň','Ñ','Ò','Ó','Ô','Õ','Ö','Ő','Ø','Ŕ','Ř','Ś','Š','Ť','Þ','Ù','Ú','Û','Ü','Ű','Ů','Ý','Ÿ','Ž' ), array( 'a','a','a','a','a','a','ae','c','c','c','d','d','d','e','e','e','e','e','e','i','i','i','i','l','l','l','n','n','o','o','o','o','o','o','o','r','r','s','s','ss','t','th','u','u','u','u','u','u','y','y','z', 'A','A','A','A','A','A','AE','C','C','C','D','D','E','E','E','E','E','E','I','I','I','I','L','L','L','N','N','O','O','O','O','O','O','O','R','R','S','S','T','TH','U','U','U','U','U','U','Y','Y','Z' ), $str ); }
Takýto "brute force" spôsob je momentálne jediný spoľahlivý a obdobná funkcia by oficiálne mala byť až v PHP 6. Konkrétne táto funkcia je využiteľná viac menej vo všetkých krajinách používajúcich latinku okrem Vietnamu a možno pár inch krajín, ktoré majú fakt divoké znaky a nechcelo sa mi nimi zapodievať ^^. Ak by aj náhodou neodstránila diakritiku, jediné čo sa stane je, že z URL vypadne daný znak.
8 komentárov
komentuj ku každému komentáru sa v databáze ukladá iba meno, text a dátum, iba za účelom zobrazenia pod článkomneukladá sa email, IP adresa ani informácie o prehliadači a údaje sa nepoužívajú na reklamu, newsletter, na žiadnu ekonomickú aktivitu, nikam sa neposielajú, sú v databáze len aby sa mohli zobraziť pod článkom
yablko [ Streda 20.10.2010, 15:14 ]
that is pretty fuckin evil
DW [ Štvrtok 15.3.2012, 16:22 ]
k tej konverzii diakritiky so str replace... vyskusaj si toto:
$bez_diakritiky=iconv('UTF-8','ASCII//TRANSLIT',$s_diakritikou);
alebo:
$bez_diakritiky=recode('utf-8::flat',$s_diakritikou);
;)
81403 (blade) [ Štvrtok 15.3.2012, 23:58 ]
echo iconv('UTF-8','ASCII//TRANSLIT','ščľťčšžťéíä§ô');
Na WS serveri: ?????????????
Na localhoste: scltcszt'e'i"aSS^o (skoro, až na tie "dĺžne")
echo recode('utf-8::flat','ščľťčšžťéíä§ô');
Fatal error: Call to undefined function recode()
Čiže stále asi neexistuje úplne spoľahlivé a zároveň elegantné riešenie.. ale dík za nápady, už nechýba veľa :)
ver4rs [ Utorok 12.6.2012, 12:14 ]
Ahojte ludia,
no konecne, ktore funguje, po mojich neuspechoch :D
Takze diki moc.
ver4rs [ Utorok 12.6.2012, 12:44 ]
Jedna otazka este ako sa to prevedie naspäť?
81403 (blade) [ Utorok 12.6.2012, 13:38 ]
Tak ako pri hocijakom stratovom spracovaní údajov - nijako :)
Ak chceš podľa URL vytiahnuť obsah z DB, potrebuješ danému obsahu priradiť presne danú URL alebo použiť ID.
ver4rs [ Streda 13.6.2012, 07:47 ]
Takže do DB, vložiť nový stĺpec s peknou URL adresou alebo do URL adresy priradiť ID.
Dakujem za odpoved.
Orly? [ Nedeľa 23.9.2012, 17:45 ]
ja používam túto (obdobnú) funkciu a funguje to vpoho :)
function toAscii($text) {
setlocale(LC_ALL, 'en_US.UTF8');
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', $text);
$clean = preg_replace("/[^a-zA-Z0-9\/_| -]/", '', $clean);
$clean = strtolower(trim($clean, '-'));
$clean = preg_replace("/[\/_| -]+/", '-', $clean);
return $clean;
}