webrebel html css javascript laravel oop php mysql wordpress kurz

Generovanie pekných URL

napísal , 20 Oct 2010 [ PHP ]

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.

ǚ
evil u is evil
napísal , 20 Oct 2010

8 komentárov

komentuj
  1. yablko [ Streda 20.10.2010, 15:14 ]

    that is pretty fuckin evil

  2. 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);

    ;)

  3. 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 :)

  4. ver4rs [ Utorok 12.6.2012, 12:14 ]

    Ahojte ludia,
    no konecne, ktore funguje, po mojich neuspechoch :D

    Takze diki moc.

  5. ver4rs [ Utorok 12.6.2012, 12:44 ]

    Jedna otazka este ako sa to prevedie naspäť?

  6. 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.

  7. 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.

  8. 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;
    }