zoek script
Quote:
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php
$dir = '/httpdocs'; //zet hier het pad van de te doorzoeken directory
$baseUrl = 'http://www.mijn domeinnaam.nl/'; //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;
}
function getFilesFromDir($dir) {
$files = array();
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
if(is_dir($dir.'/'.$file)) {
$dir2 = $dir.'/'.$file;
$files[] = getFilesFromDir($dir2);
}
else {
$files[] = $dir.'/'.$file;
}
}
}
closedir($handle);
}
return array_flat($files);
}
function array_flat($array) {
foreach($array as $a) {
if(is_array($a)) {
$tmp = array_merge($tmp, array_flat($a));
}
else {
$tmp[] = $a;
}
}
return $tmp;
}
?>
$dir = '/httpdocs'; //zet hier het pad van de te doorzoeken directory
$baseUrl = 'http://www.mijn domeinnaam.nl/'; //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;
}
function getFilesFromDir($dir) {
$files = array();
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
if(is_dir($dir.'/'.$file)) {
$dir2 = $dir.'/'.$file;
$files[] = getFilesFromDir($dir2);
}
else {
$files[] = $dir.'/'.$file;
}
}
}
closedir($handle);
}
return array_flat($files);
}
function array_flat($array) {
foreach($array as $a) {
if(is_array($a)) {
$tmp = array_merge($tmp, array_flat($a));
}
else {
$tmp[] = $a;
}
}
return $tmp;
}
?>
zoals bij //hier foutafhandeling toevoegen voor als de file niet in te lezen is
even echo 'file is niet te lezen'; dan kun je misschien zien waar het fout gaat.
Als dit de oorzaak was dan heb je een nieuw probleem. Ik heb het script beperkt tot html bestanden omdat ik aannam dat je niet wilt dat iedereen straks ook je php scripts kan gaan doorzoeken. Want staan missien dingen in die je liever geheim houdt, bijvoorbeeld een database wachtwoord.
Waar het om draait is dat je een manier nodig hebt om je content (leesbare tekst) van je php programmacode te onderscheiden. Daartoe zou je natuurlijk in je .php bestanden op zoek kunnen gaan naar < ? php en ? > en wat daartussen staat niet doorzoeken, maar dat is vrij ingewikkeld. En content die in strings staat en met print of echo wordt verzonden gaat ie dan weer niet vinden.
Een andere optie zou kunnen zijn dat je de bestanden niet rechtstreeks doorleest als files, maar opvraagt via de http server. Dat kan waarschijnlijk ook met file_get_contents, maar dan met de url in plaats van het file path. Maar dan wordt het zoeken waarschijnlijk erg traag.
Je zou ook nog de content in aparte .html bestanden kunnen zetten en die vanuit de php scripts printen, bijvoorbeeld: Maar dan moet je in het zoekscript wel de functie printGevonden aanpassen zodat hij niet de url van het .html bestand produceert, maar die van het bijbehorende .php script. En je krijgt twee keer zo veel bestanden. Tenzij je het allemaal via 1 script weet te doen, maar dat is weer ingewikkeld, want je wilt natuurlijk wel zoekmachine-vriendelijke urls.
Of je zou toch je content in een database kunnen zetten. Die kun je dan in elk script oproepen met een simpele query en met echo of print naar de browser sturen. Dan wordt je zoekscript veel simpeler.
Gewijzigd op 22/12/2012 11:14:53 door Henk Verhoeven
Om te zorgen dat ze niet door je php bestande kunnen zoeken kun je de bestanden waar je doorheen wilt zoeken een andere extensie geven zoals .inc of in een andere map zetten. Ik weet niet hoeveel php wordt gebruikt maar je kan html ook in een php bestand include en ze dan laten zoeken in de html include map.
Ik heb html bestanden toegevoegd aan mijn site en opnieuw geprobeerd een woord te zoeken waarvan ik wist dat het moest bestaan. Maar ook nu weer krijg ik de melding niet gevonden.
Ik zou terug kunnen gaan naar .html als het werkte maar zo ver ik nu kan zien is dit ook niet de oplossing. Ik heb de echo toegevoegd maar ik krijg de echo niet te zien.
Op regel 50 die begint met met if (strToLower kun je trouwens bepalen met welke extensies hij zoekt. Maar hij zoekt niet binnen de tags. De woorden (of letters) die je zoekt moeten dus in de normale tekst staan.
Nu ik dit schrijf realiseer ik mij ineens dat alles tussen de php tags ook niet wordt doorzocht. Dat heb ik gelijk getest, en inderdaad! Pff, dat ik dat niet eerder heb bedacht...
OK, hier is een nieuwe regel 50:
Code (php)
1
if (strToLower(subStr($filePath, -4)) == '.php' || strToLower(subStr($filePath, -4)) == '.htm' || strToLower(subStr($filePath, -5)) == '.html') {
En om zeker te zijn dat die warnings geen roet in het eten (gaan) gooien zet je op lege regel 87:
Hopelijk helpt dit. Zo niet, dan vrees ik dat je dit toch zelf zult moeten debuggen.
Gewijzigd op 24/12/2012 19:13:59 door Henk Verhoeven
Ik moest wel de baseUrl weg halen anders komt bij de gevonden links 2x het domein ervoor te staan na het activeren. Ik gebruik nu alleen de $dir en het werkt perfect foto's, platte tekst, categorieën alles word gevonden.
Ik wil het nog een beetje mooier maken.
En een filter voor het uitsluiten van bepaalde pagina's. Moet ik me dan gaan verdiepen in filter_list() of filter_var_array() of misschien allebei helemaal niet?
Super bedankt alvast ik ben hier erg happy mee!
Die filters lijken me een beetje ingewikkeld. Het simpelst is volgens mij om de if voorwaarde op regel 50 uit te breiden met een extra voorwaarde:
Code (php)
1
2
2
if ((strToLower(subStr($filePath, -4)) == '.php' || strToLower(subStr($filePath, -4)) == '.htm' || strToLower(subStr($filePath, -5)) == '.html'
) && !in_array($filePath, array('../test/blog/dezenietdoorzoeken.php', '../test/dezeookniet.html')) ) {
) && !in_array($filePath, array('../test/blog/dezenietdoorzoeken.php', '../test/dezeookniet.html')) ) {
|| betekent hier OF, && betekent EN, ! betekent NIET. Merk op dat ik de oude voorwaarde tussen haakjes heb gezet. Dat is nodig om er voor te zorgen dat in elk geval ook aan de nieuwe voorwaarde moet worden voldaan. Die houdt in dat $filePath niet mag voorkomen in de array. Dus als je nu de strings tussen de haakjes van array vervangt door strings met de paden van de bestanden die je wilt uitsluiten (includies $dir!) dan worden die als het goed is niet meer gevonden.
Gewijzigd op 25/12/2012 12:45:52 door Henk Verhoeven
Ik heb verschillende woorden gebruikt die mogelijk als zoek criteria gebruikt zouden kunnen worden en hij laat alles mooi zien :)
Het volgende stapje word het resultaat stylen en zorgen dat het bij mijn site past, maar dat gaat me denk ik wel lukken.
Super bedankt voor alle hulp tips en tijd die je er in heb gestoken. Ik hoop dat anderen ook wat aan dit script hebben, het werkt perfect!
Ik heb de melding als er geen resultaat is in een class gezet.
Quote:
print '<div class="geenr">'."Er zijn geen resultaten gevonden.".'</div>';
In de html is de class wel te zien maar hij reageert niet op de css?
Quote:
.geenr a {
color:#B4CF67;
}
color:#B4CF67;
}
Kan je in php niet even een div plaatsen zoals bij html?
Ik heb de html helemaal onder het script staan. Eerst komt de header, menu, zoekveld, en dan de content. Hoe kan ik nu de melding "Er zijn geen resultaten gevonden." helemaal beneden in de <div id="content"> krijgen?
*de eerste vraag was beetje dom.. het is geen link dus met a weg werkt het wel.. ik was ook met de resultaten bezig en die moest wel een a'tje hebben excuses.
Gewijzigd op 27/12/2012 20:43:53 door Erwin b
Groeten, Erwin