Tag Archives: autogenerate perex

Atomatický perex v PHP

Nedávno jsem narazil na zásadní problém. Nechat vyplňovat redaktory samotnou část pro perex nebo perex generovat automaticky. Zvítězila možnost generovat prvních několik řádků článku automaticky. Ale jak na to?

1. problém

Největším naším problémem je, že redaktor formátuje text v nějakém editoru a tudíž náš získaný text může být jakýkoliv HTML kód. Na internetu nalezneme šikovné funkce, které umějí „uříznout“ řetězec a zohlednit právě HTML značky. To nám však nepomůže v problematice, kde a jak navázat text za perexem (zbytek článku).

2. nalezení ideálního místa pro ukončení perexu

Nejdříve si stanovíme, kde náš perex bude končit, v našem případě po 300 znacích. Poté nalezneme konec slova nebo věty, abychom perex neuřízli uprostřed slova. K tomu použijeme rekurzivní funkci  najitkonecslova(). Ke konci slova přičteme +1 pro přeskočení nalezeného konce (mezery).


function najitkonecslova($retezec, $offset)
{
 // if($retezec[$offset] != '.') pro konec věty
 if($retezec[$offset] != ' ')
 $offset = najitkonecslova($retezec, $offset+1);

 return $offset;
}

$konec_perexu = najitkonecslova($clanek['obsah'], 300)+1;

3. řezání

Jednou měř a třikrát řež, beztak to posereš… Ořez znaků v UTF-8 je obecně docela vtipná záležitost v PHP5. Pokud chceme použít funkci substring(), s největší pravděpodobností se nám to nepovedle dle představ. Návodů nalezneme hromadu, já použil řešení od mého kamaráda Adama Bohunčáka využívající nesmyslné (avšak funkční) konverze z UTF-8 do UTF-8.

function my_substr($str, $start, $length)
{
 return mb_substr(iconv('utf-8', 'utf-8', $str),
  $start, $length, 'utf-8');
}

3. Učesání

Perex by měl být text bez speciálního formátování, ideálně naznačen kurzívou. Redaktorovi ale těžko vysvětlíte, že během prvních 300 znaků se má vyvarovat tučnému písmu, nadpisům apod. Vyřízneme tedy perex pomocí funkce my_substr a perex zbavíme všeho formátování, k tomu slouží php funkce strip_tags.

$perex = strip_tags(my_substr($clanek['obsah'], 0,
 $konec_perexu));

4. Výpis

Získali jsme tak perex – čistý text bez formátování. Abychom zachovali validitu i styly stránky, uzavřepe perex do odstavce <p>, můžeme přidat i nějaký styl, kterým dodefinujeme např. zmíněnou kurzívu apod. Počítáme tedy s tím, že původní text z redaktorova editoru je ve struktuře <p> … </p>. Na závěr vypíšeme zbylý, již formátovaný obsah článku za použití opět my_substr se začátkem od konce prerexu.

echo '<p>'.$perex.'</p>';
echo '<p>'.my_substr($clanek['obsah'], $konec_perexu,
 (strlen($clanek['obsah']))-$konec_perexu);

Pokud praxe ukáže, že řešení má své mouchy, určitě článek aktualizuji.