Pokud nemáme na vyhledávání moc vysoké nároky, není moc složité ho na serveru implementovat. Třeba na tomto serveru se používá prosté:
<?php mysql_query("SELECT * FROM clanky WHERE clanek LIKE '%" . mysql_real_escape_string($_GET["search"]) . "%'"); ?>
Využívá se faktu, že všechna data jsou uložena v databázi, kam podle mě jedině patří. Pokud je dat v databázi větší množství, je možné využít např. fulltextové indexy. Pokud jsou texty i v souborech, můžeme je procházet třeba funkcí glob a text hledat např. funkcí strpos.
Co ale v případě, kdy služby serveru nelze použít? Texty z tohoto serveru je možné stáhnout a pracovat s nimi bez připojení k Internetu. Vyhledávat v nich jde potom samozřejmě třeba příkazem grep nebo jiným obecným vyhledáváním souborů, z prostředí webového prohlížeče by to ale jistě bylo pohodlnější.
V moderních prohlížečích lze toto vyhledávání zajistit díky technologii AJAX:
<table cellpadding="3" cellspacing="0">
<tbody id="vysledky"></tbody>
</table>
<script type="text/javascript">
function obsluha(xmlhttp) {
if (xmlhttp.readyState == 4) {
var match = xmlhttp.responseText.match(/<h1><a href="(.*)">(.*)<\/a><\/h1>([^˙]*)<!-- konec textu -->/);
if (match && (match[2] + match[3]).search(search) > -1) {
nalezeno++;
var tr = document.getElementById('vysledky').appendChild(document.createElement("TR"));
tr.appendChild(document.createElement("TD")).innerHTML = '<a href="' + match[1] + '">' + match[2] + '</a>';
}
zbyva--;
if (!zbyva && !nalezeno) {
alert('Zadaný řetězec nebyl nalezen.');
}
}
}
var search = new RegExp(location.search.replace('?search=', ''), 'i');
var nalezeno = 0;
var zbyva = 1; // celkový počet prohledávaných souborů
send_xmlhttprequest(obsluha, 'GET', 'ajax.html');
// další soubory k prohledání
</script>
Prohlížeč začne při zavolání funkcí send_xmlhttprequest paralelně prohledávat všechny soubory a do tabulky vypisovat odkazy na ty, kde byl hledaný text nalezen. Při vytváření tohoto kódu jsem narazil na několik nástrah:
obsluha se totiž nevolá z konkrétního místa dokumentu, ale volá ji sám prohlížeč při stažení dat.document.getElementById('vysledky').innerHTML += '…', bylo nutné použít DOM.. v regulárním výrazu strefí jakýkoliv znak kromě konce řádku. Na rozdíl od PHP ale neexistuje modifikátor s, který by toto chování změnil. Pokud se jako náhrada použije regulární výraz (.|\n), je kód v IE příšerně pomalý. Vyřešit je to možné tak, že se \n před hledáním nahradí jiným znakem nebo se použije výčet všech možných znaků včetně znaku konce řádku (nebo negace nepoužitého znaku).Přijde mi, že k řešení je potřeba se spíše prokličkovat přes řadu nástrah, z nichž největší je rozdílné chování prohlížečů.
Přijďte si o tomto tématu popovídat na školení JavaScript a AJAX.