Vyhledávání v JavaScriptu

Školení, která pořádám

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:

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.

Jakub Vrána, Řešení problému, 10.5.2006, diskuse: 15 (nové: 0)

Diskuse

Martin:

lol! Tenhle blog mě nikdy nezklame, sranda je tu větší než na thedailywtf.com! Autorovy nápady stojí za to. Vyhledávání offline pomocí AJAX přímo v kódu stránek..... cha cha cha cha
Programátor opravdu není ten, kdo umí řadit příkazy za sebe a rozchodit kdejakou nesmyslnou myšlenku...
# 10.5.2006 08:32:55 reagovat

Garçon:

Taky jsem se musel smát a říkal jsem si, že je to legrační blbost, ale pak jsem si řek, že třeba pro hledání v dokumentaci na disku to může být řešení.
# 10.5.2006 12:37:17 reagovat

ikona Jakub Vrána:

Nevím, co ti na myšlence připadá nesmyslného. Uživatelé jsou zvyklí na hledání přímo na stránkách a když ho nejde realizovat pohodlně na straně serveru (ať už u zmiňované verze pro stažení nebo třeba u HTML nápovědy), tak popisuji, jak se dá realizovat v JavaScriptu.

Co převratného jsi nám vlastně mudrováním o "řazení příkazů za sebe" chtěl sdělit?
# 11.5.2006 00:33:19 reagovat

Spud:

Me to pripada jako velice elegantni reseni napriklad u CD prezentaci, supr!
# 11.5.2006 11:30:25 reagovat

l:

Je to dobre, to jen Martin je nejaky divny.
# 18.5.2006 20:06:44 reagovat

ATom:

Hezké. Jen aby někdo nezapomněl na předchozí články o SQL injection a fakt nedal do SQL příkazu jen $_GET[search] ;-)
# 10.5.2006 08:56:28 reagovat

ikona Jakub Vrána:

V patičce stránky je uvedeno, že skripty předpokládají nastavení magic_quotes_gpc=On. S tímto nastavením je kód zcela v pořádku, více to rozebírám právě ve zmiňovaném článku: http://php.vrana.cz/obrana-proti-sql-injection.php.
# 10.5.2006 11:49:34 reagovat

Garçon:

Začnu číst patičky, slibuju. ;-)
# 10.5.2006 12:30:05 reagovat

ikona Jakub Vrána:

Kód jsem předělal na magic_quotes_gpc = Off a zmínil jsem to v patičce.
# 11.5.2009 05:31:58 reagovat

JKa:

Možná by stálo za to zmínit i možnost jednoduchého vyhledávání na stránkách pomocí Google a modifikátoru site:www.example.com. U stránek, kde nejsou časté změny to může stačit.
# 10.5.2006 17:32:43 reagovat

ikona Jakub Vrána:

Toto vyhledávání ale pochopitelně nejde použít v případě, kdy stránky nejsou veřejně dostupné a třeba se ani nezobrazují přes webový server. Právě na tento případ je totiž článek zaměřen.
# 10.5.2006 17:49:22 reagovat

Jiný Martin:

Martinovi z prvního postu: Vrátil jsem se k tomuto článku, jen abych napsal, že právě pomocí regexpů v JS má řešeno vyhledávání třeba nápověda k Adobe Photoshop.
Zkus příště trochu přemýšlet, než začneš zaklínat thedailywtf.
# 27.5.2006 12:49:39 reagovat

Lukas:

Ciste pro lajka, kde do toho scriptu vstupuje hledany retezec?
# 4.12.2006 11:45:53 reagovat

Danoha:

Taky by mě zajímalo.
# 30.7.2007 17:30:36 reagovat

ikona Jakub Vrána:

V parametru URL search.
# 4.8.2007 22:34:57 reagovat

Vložit příspěvek

Používejte diakritiku. Nelze používat HTML značky, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

© 2005-2008 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.