Igor Kulman

Ako na automatické vysvetlivky skratiek v texte

· Igor Kulman

Na viacerých blogoch som si všimol, že jednotlivé skratky, ktoré sú v texte použité, sú pri ich (prvom) výskyte automatický vysvetlené pomocou tagu acronym. Celkom sa mi to zapáčilo, tak som sa rozhodol naprogramovať si podobnú funkciu, ktorú v CMS zavolám na text článku a tá mi automaticky vygeneruje takého vysvetlivky.

Základom správneho fungovania je dostatočne rozsiahla databáza skratiek. Keďže som na internete žiadnu použiteľnú databázu v textovom formáte nenašiel, rozhodol som sa urobiť si vlastnú s tým, že ju budem podľa potreby priebežne dopĺňať. Ako formát uloženia som zvolil textový súbor v tvare Skratka = vysvetlenie, teda:

PHP = PHP Hypertext Preprocessor
XHTML = eXtensible Hypertext Markup Language
XML = eXtensible Markup Language
AJAX = Asynchronous Javascript and XML
CMS = Content Management System
.
.
.

PHP funkcia na nahradenie Skratiek -> za skratka nie je zložitá. Funkcia načíta dátový súbor, ten potom rozdelí na dve polia; pole so skratkami a pole s vysvetleniami. Na samotné nahradenie sa použije funkcia preg_replace(mixed pattern, mixed replacement, mixed subject [, int limit]) s použitím nepovinného parametra limit s hodnotou 1, čo zabezpečí, že každá skratka bude vysvetlená iba pri svojom prvom použití. Použitie triedenia pomocou funkcie ksort( array pole [, int sort_flags] ) je nepovinné, manuál ho však odporúča.

function get_acronyms(&$text) {

  $data = file("acronyms.txt");
  
  $patterns=array();
  $replacements=array();
  
  for ($i=0;$i<count($data);$i++) {
  
    $tmp = explode("=",$data[$i]);
    $patterns[$i]="/\b(".trim($tmp[0]).")\b/";
    $replacements[$i]="<acronym title=\"".trim($tmp[1])."\">\\1</acronym>";
  
  }
  
  ksort($patterns);
  ksort($replacements);
  
  $text = preg_replace($patterns, $replacements, $text,1);
}

Následné použitie je už úplne jednoduché.

get_acronyms($string);

Doplnené: Od Roberta Madaja (spravodaj.madaj.net) som dostal jeho databázu acronym.db, má podobný formát, len výrazy sú oddelené bodkou, v prípade použitia tejto databázy zmeňte prvý parameter funkcie explode na bodkou.