Když už si na stránkách dáme práci s implementací vyhledávání, je užitečné nalezená slova vhodně zvýraznit. Kdokoliv k tomu sice může použít vyhledávání dostupné přímo v prohlížeči, ale trocha pohodlí návštěvníky jistě potěší. Zvýrazňování se dá zajistit buď u každého vypisovaného textu zvlášť (na což je ale jednoduché zapomenout, znepřehledňuje to kód a nedá se to použít u statických textů vypisovaných mimo PHP) nebo společně pro celou stránku s využitím funkce ob_start.
<?php function odzvyraznit($matches) { return preg_replace('~<span class="search-result">([^<]*)</span>~i', '\\1', $matches[0]); } function zvyraznit($text) { $search = preg_quote(htmlspecialchars($_GET["search"]), '~'); if ($search) { $text = preg_replace("~$search~i", '<span class="search-result">\\0</span>', $text); // odstranění zvýrazňování z obsahu <option> a <textarea> a zevnitř značek a entit $span = '<span class="search-result">[^<]*</span>'; $pattern = "~<(option|textarea)[\\s>]([^<]*$span)+|<([^>]*$span)+|&([^;]*$span)+~i"; $text = preg_replace_callback($pattern, 'odzvyraznit', $text); } return $text; } // zvýrazňování pro každý vypisovaný text zvlášť echo "<h1>" . zvyraznit($row["nadpis"]) . "</h1>\n"; echo zvyraznit($row["clanek"]); // obdobně diskuse a spol., statické texty je nutné převést do PHP // zvýrazňování pro celou stránku ob_start('zvyraznit'); // umístit před začátek zvýrazňovaného textu echo "<h1>$row[nadpis]</h1>\n"; echo $row["clanek"]; // diskuse, statické texty, ... ob_end_flush(); // umístit za konec zvýrazňovaného textu - pokud odpovídá konci dokumentu, lze vynechat ?>
Pokud nepoužíváte zalomení konce řádků uvnitř značek (tedy např. <a\nhref="">
), dá se funkci ob_start předat druhý parametr, který zajistí plynulé vypisování výstupu na straně serveru. Zvýrazňování si nerozumí s kódem uvnitř značky <script>
. Ale vzhledem k tomu, že při tomto použití značky nejde HTML kód napsat zároveň zpětně a dopředně kompatibilní, je stejně lepší se mu vyhnout v jakémkoliv dokumentu a skripty vkládat vždy externě (důvod je ten, že HTML doporučuje kód uzavírat do HTML komentářů, ale XML parser používaný v XHTML může text uvnitř těchto komentářů bez varování odstranit).
Nejlepší na tom všem je, že tento způsob se dá použít nejen pro zvýraznění výsledků interního vyhledávání, ale dá se použít i pro zvýraznění hledání externím vyhledávačem (např. Googlem). Stačí využít proměnnou $_SERVER["HTTP_REFERER"] a proměnnou $search
naplnit např. takto:
<?php if (preg_match('~^http://www\\.google\\..*[?&]q=([^&]+)~', $_SERVER["HTTP_REFERER"], $matches)) { $search = urldecode($matches[1]); //~ $search = iconv('utf-8', 'windows-1250', $search); // převod kódování $search = preg_replace('~all[^ ]+:.*~', '', $search); // odstranění operátorů all* $search = preg_replace('~([^ ]+:|-)[^ ]*~', '', $search); // odstranění operátorů a nechtěných slov $search = preg_replace('~[\\~+()]|\\bOR\\b~i', '', $search); // odstranění +~() a OR $search = preg_quote(htmlspecialchars($search), '~'); // escapování pro preg $search = preg_replace('~ +~', '|', $search); // nahrazení mezer znakem pro nebo $search = preg_replace('~"([^"]*)"~e', 'str_replace("|", "\\\\\\\\s+", "\\1")', $search); // zpracování uvozovek $search = "\\b($search)\\b"; // hledají se pouze celá slova } else { $search = preg_quote(htmlspecialchars($_GET["search"]), '~'); } ?>
Krapánek se to zesložitilo, ale mělo by to postihovat většinu funkcí, které Google pro vyhledávání nabízí. Obdobně by se zvýraznění výsledků vyhledávání dalo samozřejmě udělat i pro další vyhledávače.
Diskuse je zrušena z důvodu spamu.