zoek script
Kan iemand mij helpen aan een simpel zoek script? op Google kom ik niks bruikbaars tegen of kan iemand mij een beetje uitleggen hoe ik zo iets zou kunnen maken, al is mijn PHP kennis niet heel super.
Groeten, Erwin
Waar wil je precies in zoeken? In je eigen database of via google?
In mijn eigen site ik heb een foto site met een blogje en wil graag dat als er een match is met het zoek woord de betreffende pagina'(s) getoond worden. Zeg maar zelfde als hier op phphulp.
Op zich is het, zelfs al is je kennis van PHP niet super, niet super moeilijk er van uitgaande dat je teksten/gegevens opgeslagen zijn in een database.
Maak een formulier waarin men het zoekwoord kan opgeven.
Maak een SELECT-query met daarin WHERE en LIKE.
Indien iets gevonden wordt -> tonen. Anders melding dat er niets gevonden is.
Let ook op goede controle / foutafhandeling.
Prima als je op meerdere sites je vraag plaatst, maar het is wel zo netjes om dat even te melden, zodat we weten wat er al aan reactie(s) is geweest. (http://www.pfz.nl/forum/topic/8842-zoek-script/)
Gewijzigd op 08/12/2012 12:59:09 door Obelix Idefix
Hoe is die data opgeslagen?
Mijn hele site is platte html. Ik liep vast met een perl zoek script en merkte dat ik dan de werking ervan niet weet. Ik wil graag iets simpels. Ik merk dat ik dus waarschijnlijk een database moet aanmaken met de belangrijkste zoek woorden en dan iets dat de pagina's van de betreffende woorden toont?
Volgens mij wordt het lastig. Er zijn volgens mij wel manieren om te zoeken, maar ja kan dan moeilijk de pagina's laden zoals hier op php hulp.
of
$file = file_get_contents ('path/to/file.ext');
preg_match_all ('regex_pattern_here', $file, $matches);
print_r ($matches);
Gewijzigd op 08/12/2012 16:46:54 door John D
Is het dan niet makkelijker om gewoon de content in een database te zetten
hm nog niet zo simpel merk ik al. Ik moet misschien nog maar even overdenken of het de moeite is voor een site met maar 30 pagina's om helemaal een zoek functie te gaan gebruiken. Allemaal bedankt voor de reacties en het mee denken.
- zoekstring splitsen op spaties in woorden met explode
- directory van je website root met al zijn sudirectories doorlezen en de file-paden verzamelen (functie)
- files waarvan de namen eindigen op .html content ophalen met file_get_contents()
- content er uit halen met striptags()
- voor elk woord de content doozoeken met stripos() of preg_match()
- lijstje met urls van de matchende files printen
Je kunt het nog wat mooier maken door:
- Per gevonden pagina de titel op te sporen en in het lijstje te tonen
- Zoals google doet een stuk van de tekst rondom elk gevonden woord afbeelden per gevonden pagina
Wellicht moet je ook nog wat filtering toevoegen bijvoorbeeld als sommige bestanden onzichtbaar moeten blijven en dus niet moeten worden doorzocht.
Gewijzigd op 12/12/2012 10:36:46 door Henk Verhoeven
Dat klinkt voor mij erg moeilijk ;) Weetje misschien of hier ergens een tutorial of uitgebreidere informatie van is?
Erwin b op 13/12/2012 20:45:33:
Dat klinkt voor mij erg moeilijk ;) Weetje misschien of hier ergens een tutorial of uitgebreidere informatie van is?
Je zou deze kunnen gebruiken
http://youhack.me/2010/04/28/creating-a-fancy-search-feature-with-php-mysql-and-jquery/
Is tutorial + downloadbare sourcecode.
Je zal wel een beetje basiskennis van html, php, css en jquery moeten hebben. maar al met al is het niet heel erg ingewikkelde code.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
$dir = '.'; //zet hier het pad van de te doorzoeken directory
$baseUrl = ''; //zet hier de url van de te doorzoeken directory
if (isSet($_POST['zoek'])) {
$zoekNaar = trim($_POST['zoekterm']);
$woorden = explode(' ', $zoekNaar);
$gevonden = zoekFiles($dir, $woorden);
} else {
$zoekNaar = '';
}
printFormulier($zoekNaar);
if ($zoekNaar) {
if ($gevonden)
printGevonden($gevonden, $baseUrl);
else
print "niets gevonden";
}
function printFormulier($zoekNaar) {
print '
<form name="zoekformulier" method="POST" action="zoek.php" ENCTYPE="multipart/form-data" accept-charset="ISO-8859-15">
<input type="text" name="zoekterm" value="';
print htmlspecialchars($zoekNaar, ENT_QUOTES, 'ISO-8859-15');
print '">
<input type="submit" name="zoek" value="zoek">
</form>';
}
function printGevonden($gevonden, $baseUrl) {
forEach($gevonden as $filePath) {
$delen = explode('/', $filePath);
print '<a href="';
print $baseUrl; //moet eigenlijk ook geexplode en in delen urlEncoded, maar als je normale directorynamen hebt gaat dit wel goed
forEach($delen as $i => $deel) {
if ($i) print "/";
print rawUrlEncode($deel);
}
print '">';
print htmlspecialchars($filePath, ENT_QUOTES, 'ISO-8859-15');
print '</a><br>';
}
}
function zoekFiles($dir, $woorden) {
$files = getFilesFromDir($dir);
$gevonden = array();
$vanaf = strLen($dir) + 1;
forEach($files as $filePath) {
if (strToLower(subStr($filePath, -4)) == '.htm' || strToLower(subStr($filePath, -5)) == '.html') {
$html = file_get_contents($filePath);
//hier foutafhandeling toevoegen voor als de file niet in te lezen is
$content = strip_tags($html);
forEach($woorden as $woord) {
$pos = stripos($content, $woord);
if ($pos !== false) {
$gevonden[] = subStr($filePath, $vanaf);
break;
}
}
}
}
return $gevonden;
}
$baseUrl = ''; //zet hier de url van de te doorzoeken directory
if (isSet($_POST['zoek'])) {
$zoekNaar = trim($_POST['zoekterm']);
$woorden = explode(' ', $zoekNaar);
$gevonden = zoekFiles($dir, $woorden);
} else {
$zoekNaar = '';
}
printFormulier($zoekNaar);
if ($zoekNaar) {
if ($gevonden)
printGevonden($gevonden, $baseUrl);
else
print "niets gevonden";
}
function printFormulier($zoekNaar) {
print '
<form name="zoekformulier" method="POST" action="zoek.php" ENCTYPE="multipart/form-data" accept-charset="ISO-8859-15">
<input type="text" name="zoekterm" value="';
print htmlspecialchars($zoekNaar, ENT_QUOTES, 'ISO-8859-15');
print '">
<input type="submit" name="zoek" value="zoek">
</form>';
}
function printGevonden($gevonden, $baseUrl) {
forEach($gevonden as $filePath) {
$delen = explode('/', $filePath);
print '<a href="';
print $baseUrl; //moet eigenlijk ook geexplode en in delen urlEncoded, maar als je normale directorynamen hebt gaat dit wel goed
forEach($delen as $i => $deel) {
if ($i) print "/";
print rawUrlEncode($deel);
}
print '">';
print htmlspecialchars($filePath, ENT_QUOTES, 'ISO-8859-15');
print '</a><br>';
}
}
function zoekFiles($dir, $woorden) {
$files = getFilesFromDir($dir);
$gevonden = array();
$vanaf = strLen($dir) + 1;
forEach($files as $filePath) {
if (strToLower(subStr($filePath, -4)) == '.htm' || strToLower(subStr($filePath, -5)) == '.html') {
$html = file_get_contents($filePath);
//hier foutafhandeling toevoegen voor als de file niet in te lezen is
$content = strip_tags($html);
forEach($woorden as $woord) {
$pos = stripos($content, $woord);
if ($pos !== false) {
$gevonden[] = subStr($filePath, $vanaf);
break;
}
}
}
}
return $gevonden;
}
de functies getFilesFromDir() en array_flat() moet je er zelf nog even achter plakken, zie deze link. Als je script zoek.php heet zou het moeten werken. Heet het anders, vervang dan "zoek.php" in de functie printFormulier() door de filenaam van je script.
Gewijzigd op 14/12/2012 11:35:19 door Henk Verhoeven
Groeten, Erwin
Toevoeging op 14/12/2012 22:58:50:
Bedankt voor het mee denken Max en Henk. Ik ben begonnen met het script van Henk omdat ik dan niet steeds een database hoef bij te werken naar een nieuw artikel.
@Henk, ik krijg het script niet werkend. Ik heb het stukje script van de link er achter geplakt maar de zoek.php toont dan gelijk de array als ik het bestand open.
Hij toont gelijk deze regel:
Quote:
Array ( [0] => ../test/blog/gele-kwikstaart.php [1] => ../test/blog/grote-zilverreiger.php [2] => ../test/blog/oranjetipje.php [3] => ../test/blog/tapuit.php [4] => ../test/blog/torenvalk.php [5] => ../test/blog/vreugderijkerwaard.php )
Gewijzigd op 14/12/2012 23:00:42 door Erwin b
@Henk Weet jij misschien wat ik verkeerd doe of waarom de arrey getoond word?
Dat is simpel te verklaren, je maakt met zoekFiles() immers een array aan die je returned ($gevonden).
Die dien je nog te "filteren" en dan kun je volgens mij gewoon linken naar welk php bestand je wilt..
Dit wil ik best voor je uitwerken, maar niet meer op dit uur van de dag :)
hm 5 uur is wel heel erg vroeg ja of heel laat.. Het zou super zijn als je het nog iets verder zou willen uitwerken. Zou je het hier kunnen posten en misschien ook nog uitleg erbij? In mijn naaste omgeving zijn ook andere geïnteresseerd in dit script, het is erg lastig om met weinig kennis van php/java een beetje goed werkend zoek script te vinden. Ik denk dat veel meer mensen hier wat aan hebben.
Ik heb die script wel getest. Hij stond gewoon in een bestand genaamd zoek.php, met < ? php (zonder de spaties) ervoor en de twee functies getFilesFromDir() en array_flat() er achter en dan ? >. Had eigenlijk nog een header boven gemoeten en <.body></html> er achter, maar toen ik hem opvroeg via FireFox kreeg ik een leeg invulveld met een zoek knop wel gewoon te zien (verder niets). Na invullen en op de zoek knop drukken kreeg ik de resultaten. (nu ja, ik heb hem natuurlijk wel eerst moeten debuggen ;-) )
Er is nog veel aan te verbeteren. Zo telt hij bijvoorbeeld niet hoe vaak de woorden voorkomen. Daar zou hij namelijk mooi op kunnen sorteren. En hij is natuurlijk ook niet geschikt voor hele grote en hele drukke sites. Ik zag het dan ook meer als een manier om je op weg te helpen waarna je hem zelf aan je wensen aan zou passen. En dan zijn er hier altijd wel mensen die je daarbij willen helpen, zoals je ziet zelfs om 04:56 's nachts :-)
Voor een kant en klare script zou ik meer denken aan iets met een zoekwoordenindex in een database, en een spider om willekeurige sites mee in kaart te brengen. En misschien iets leuks als hier (zet een paar vinkjes en druk erboven op zoeken). Maar een spider heb ik nog niet en de rest moet ik dan wel losmaken uit die site en de nodige uitleg bij schrijven... Daarom heb ik het hier "simpel&doe het zelf" gehouden. Past ook beter bij dit deel van het forum.
Gewijzigd op 17/12/2012 09:59:57 door Henk Verhoeven
Volgens mij kan je de gegevens uit de array halen met foreach.
Groeten, Erwin