Geschrieben von sebigisler am 26.06.2005, 06:26

Da bin ich wiedereinmal mit einem neuen Tut! Allerdings gleichzeitig mit einem kleinen
Problem: Mein Tutorial hat über 400 Zeilen. Also war es ziemlich anspruchsvoll das ganze
übersichtlich zu gestalten. Als Alternative habe ich deshalb dieses Tutorial auch im Internet.
Dort ist es übersichtlicher dargestellt. Den Link findet ihr unten

http://sebigisler.xardas.lima-city.de/suchfunktion/suchfunktion.html
oder: http://home.pages.at/sebigisler/suchfunktion.html

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Tutorial - Jetz erstelle ich ein Dateisuchfunktion für meine Webspace!

Wenn es darum geht eine bestimmte Datei auf einer gut belegten Webspace zu suchen,
kann es schon einmal zu Problemen kommen. Deshalb habe ich ein kleines PHP-Script
gecodet mit welche ganz einfach nach Dateien auf einer Webspace gesucht werden kann.
Das Suchscript beinhaltet folgende Funktionen:

+ Suchscript erstellt automatisch ein Logfile, in welchem eingegebene Suchbegriffe gespeichert werden
+ E-Mailbenachrichtigung bei neuer Suche (Auch ausschaltbar)
+ Auswertung der Metatags und des title Tags
+ Übersichtliche Zusammenstellung der Suchergebnisse
+ Ausschliessen einzelner Dateien (z.B. des Suchscripts)
+ Anfang (Erste 50 Buchstaben) des Files im Suchergebnis
+ Einbeziehung nur von festgelegten Dateitypen
+ Bei nur einem Suchergebnis wird direkt dieses angezeigt (optional)
+ Suchbereich auswählbar (Ganze Webspace oder nur ein Verzeichnis)

Allgemein...
Das Suchscript beansprucht vier Dateien; eine fünfte Datei (Logfile) wird später automatisch
erstellt. Erstellen sie auf ihrer Webspace ein neues Verzeichnis mit dem Namen
Dateisuche. Darin werden sie nun vier Dokumente erstellen:

---------------------------------------
search.php
suchen.php
suchmaske.php
search_config.php
--------------------------------------

Der Quellcode der einzelnen Datein

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ search.php
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<!--Diese Datei als search.php speichern//-->
<?php

ob_start();

$mtime = microtime(); $mtime = explode( ' ', $mtime); $mtime = $mtime[1] + $mtime[0];
$such_start = $mtime;

if(!function_exists('file_get_contents')) {
echo "Dieses Script erfordert PHP Version 4.3.0 oder h&ouml;her!";
exit; //Gibt eine Fehlermeldung zurück, wenn auf deinem Server kein PHP installiert ist
}
include("search_config.php");

//Falls kein Suchbegriff gefunden wird
$noresult = "Zu ihrem Suchbegriff <b><em>\"$search\"</em>
</b> wurde leider keine passende Datei gefunden.<br>
Versuchen sie es bitte erneut";
$minlength = "Geben Sie bitte einen Suchbegriff von mindestens ".$length."
Buchstaben L&auml;nge ein.";
$searchtip = "<br /><br /><strong>Suchtips:</strong></p><ul>
<li>Die Eingabe von Platzhalterzeichen (*) ist nicht erforderlich.</li>
<li>Wenn Sie Ihre Suche auf ganze W&ouml;rter einschr&auml;nken wollen, f&uuml;gen
Sie vor und nach dem Suchbegriff jeweils einen Leerschlag ein.</li></ul>";
if(isset($_POST["search"])) {
if ($_POST["search"] != "") {
$search = $_POST["search"];
$search = htmlspecialchars($search);
$search = str_replace('*','',$search);
}

if(empty($search)) {$search=$_POST[search];}

if(strlen($search) >= $length && $search != $value) {

$array = "";
$ausgabe ="";
$found = "0";
$n = "";
$e = "";
$sorthinweis = "";

echo "Sie suchten nach dem Begriff <em>\"$search\"</em> <br />\n";

// die Funktion zum Durchsuchen des Verzeichnisses:
function tree($ordner, $sub = FALSE) {
global $ergeb;
$handle = opendir($ordner);
while (false !== ($file = readdir ($handle))) {
if($file != "." && $file != ".." && is_dir($ordner."/".$file)) {
$compl = $ordner."/".$file."/";
//echo $compl."<br>";
$ergeb = $ergeb.",".$compl;
tree($ordner."/".$file, TRUE);
}
}
closedir($handle);
}

if ($alledirs) {
tree(".");
$ergeb = "./".$ergeb;
$dirs = explode (",", $ergeb);
}

foreach($dirs as $dir) {
$verz = opendir($dir);

while($file = readdir($verz)) {

// Mit dieser Funktion schliessen sie einzelne Dateien von der Suche aus
if(!in_array($file,$exclude_files) && preg_match("=(\.$dat_type)$=",$file)) {

$string = file_get_contents($dir.$file);
$string = html_entity_decode($string);

foreach($exclude_strings as $k) $string = str_replace($k,"",$string);


//Die nachfolgenden Zeilen lesen die Meta-Tags der gefunden Dokumente aus
$del_start = '<meta name="description" content="';
$del_end = '"';

$pos=strpos(strtolower($string),$del_start) + strlen($del_start);
$substring_rest = substr($string,$pos);
$end_pos=strpos($substring_rest,$del_end);
$description = substr($substring_rest,0,$end_pos);

//Die kommenden Zeilen werten die Keywordtags aus
$del_start = '<meta name="keywords" content="';
$del_end = '"';

$pos=strpos(strtolower($string),$del_start) + strlen($del_start);
$substring_rest = substr($string,$pos);
$end_pos=strpos($substring_rest,$del_end);
$keywords = substr($substring_rest,0,$end_pos);

// Diese Zeile wertet den <title>-tag aus; Der Titel wird im Suchergebnis angezeigt
$del_start = '<title>';
$del_end = '</title>';

$pos=strpos($string,$del_start) + strlen($del_start);
$substring_rest = substr($string,$pos);
$end_pos=strpos($substring_rest,$del_end);
$titel = substr($substring_rest,0,$end_pos);

// Die kommenden Zeilen zeigen die Metatags der gefunden Dokumente an
if ($key) $string=$string.$keywords;
if ($desc) $string=$string.$description;
if ($tit) $string=$string.$titel;

if ($limit_start != "") {
$pos=strpos($string,$limit_start) + strlen($limit_start);
$substring_rest = substr($string,$pos);
}
else {
$substring_rest = $string;
}

if ($limit_end != "") {
$end_pos=strpos($substring_rest,$limit_end);
$string = substr($substring_rest,0,$end_pos);
}
else {
$string = $substring_rest;
}

//Inhalt von tags auswerten:
if ($tags==false) $string = strip_tags($string);

$string = ereg_replace("\n", "", $string);

// jetzt die Ausgabe des Kontext vorbereiten:
$stringlow = strtolower($string);
$searchlow = strtolower($search);
$test = substr_count($stringlow, $searchlow);

if(!empty($test)) {

$pos=strpos($stringlow,$searchlow);
$piece1 = strip_tags(substr($string,$pos-$vor,$vor));
$piece2 = strip_tags(substr($string,$pos+strlen($search),$nach));
$rest = "$piece1<strong>$search</strong>$piece2";
if($vor=="0" && $nach=="0") $rest = "";

if($filename) $titel = $file;

if($titel == "") $titel = $file;

if($titel != "") {
//$array .= '['.$test.'] <a href="'.$dir.$file.'">'.$titel.'</a><br />'.$rest.'<br /><br />';
$array .= "[".$test."] <a href=\"".$dir.$file."\">".$titel."</a><br />".$rest."<br /><br />\n";
$found ++;

$link = $file; //Dieser Link wird im Suchergebnis angezeigt
}
}
}
}
closedir($verz);
}
// Wenn sie eine E-Mailbenachrichtigung eingestellt haben, wird dieser Teil an sie gesendet
if($mail == true && $search != $value) {
mail("$adminaddress","Suche auf $seite","Folgender Begriff wurde
soeben auf der Seite $seite gesucht: \n$search\nTreffer: $found");<p><hr><p>
Um die E-Mailbenachrichtigung auszuschalten, setzen sie bitte $mail auf false
}

// Die folgenden Zeilen schreiben ein ein Logfile
$today = date("d.m. H:i ");
//$nl = $today.$_POST["search"] ;
$nl = html_entity_decode($today.$_POST["search"])."(".$found.")\n";

if($fp = fopen('verwendete_suchbegriffe.txt', 'a+')) {
// falls die Logdatei nicht existiert, wird versucht, sie anzulegen.
flock($fp, LOCK_EX | LOCK_NB) or die("Die Logdatei kann derzeit nicht verändert werden.");
//flock($fp,2) or die("Die Logdatei kann derzeit nicht verändert werden");
fwrite($fp, $nl);
fclose($fp);
}
//Bei keinen Suchresultaten:
if($found == "0") {
echo $noresult;
}
//Falls eine Datei - direkt zu ihr
if($found == "1" && $jump == true) {
header("Location: http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/".$link);
exit;
}
//Falls mehrere Dateien gefunden wurden
if($found > "1") {
$n = "n"; $e = "e";
if($treffer) {
$sorthinweis = "<br />Sortiert nach [Anzahl der Treffer pro Dokument].";
}
}

if($found >= "1") {
echo "Es wurde$n <b><strong>$found</strong></b> Dokument$e gefunden.$sorthinweis";
echo "<br /><br />";

$array = explode("\n", $array);
natsort($array);
reset($array);
$array = array_reverse($array);

while(list($line_num, $line) = each($array)) {
if($treffer) {
$ausgabe .= "$line\n";
} else {
$ausgabe .= substr(strstr($line, '] '),2)."\n";
}
}
print $ausgabe;
}
}

else {echo $minlength;}
}
else {echo $minlength;}
echo $searchtip;

$mtime = microtime(); $mtime = explode( ' ', $mtime); $mtime = $mtime[1] + $mtime[0];
$such_ende = $mtime;
$time_gesamt = $such_ende - $such_start;
if(isset($found)) {
echo "<div id='searchfooter'><p>Suche in ".number_format($time_gesamt,2,',','.')." Sekunden ausgeführt</p></div>";
} else {
echo "<div id='searchfooter'><p>Suchscript $wdw</p></div>";
}
?>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ suchen.php
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

<!--Diese Datei als suchen.php abspeichern, sie liefert die Suchergebnisse//-->
<html>

<title>Suchergebnisse</title>

<?php ob_start(); ?>

<a>Suchergebnisse</a>
<!--Eingabeformular//-->
<form id="search" method="post" action="suchen.php">
<p><label for="suchbegriff">Im Projekt suchen:</label>
<input type="text" name="search" id="suchbegriff" value="Suchbegriff" size="13" title=" Suchbegriff hier eingeben " onblur="if(this.value=='')this.value='Suchbegriff';" onfocus="if(this.value=='Suchbegriff')this.value='';" />
<input type="submit" value="Suchen" />
</p>
</form>
<div id="output">
<p><?php include("search.php");?> <!--include Befehl; öffnet die Suchergebnisse//-->
</div>

<!--
<?php
# --><p>Dein Server unterstützt kein PHP!</p><!--
?>
-->

</html>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ suchmaske.php
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

<!--Diese Datei als suchmaske.php speichern//-->
<html>

<!--Diese Datei ist lediglich als Suchmaske gedacht//-->

<title>Dateisuche</title>

<!--Suchformular//-->
<center><form id="search" method="post" action="suchen.php">
<p><label for="suchbegriff">Suchbegriff:</label><p>
<input type="text" name="search" id="suchbegriff" value="Suchbegriff" size="13" title=" Suchbegriff hier eingeben "
onblur="if(this.value=='')this.value='Suchbegriff';" onfocus="if(this.value=='Suchbegriff')this.value='';" /><br>
<input type="submit" value="Suchen" />
</p>
</form></center>

</html>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ search_config.php
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

<?php
//In dieser Datei werden die Suchoptionen bestimmt

error_reporting(E_ALL);

// Falls sie eine E-Mailbenachrichtigung wünschen, die nachfolgenden Zeilen ändern

$mail = false;
// true für E-Mail Benachrichtigung, false, falls keine E-Mail Benachrichtigung gewünscht.

$adminaddress = "ihre@email.de";
// an diese Adresse geht die E-Mail

$seite = "Suchbegriffe";
// wird im E-Mail Betreff und Text angegeben

//Von hier an sind optionale Einstellungen zu tätigen

// Die unten angegeben Dateiendungen werden von der Suche berücksichtigt
// Dateiendungen müssen durch Pipe "|" getrennt werden
$dat_type = "htm|html|php|txt|gif|mhtm|dat|png|bmp|jpeg|jpg";

$value = "Suchbegriff";

// Legt die Mindestlänge des Suchbegriffes fest
$length = 3;

// Hier werden die zu durchsuchenden Verzeichnisse festgelegt
// Beispiel: $dirs = array('./','./subdir/','./subdir/subsub/');

$alledirs = true;
// Falls du nur das aktuelle Verzeichnis durchsuchen lassen möchtest,
//setze hier false (Verringert die Suchzeit)

// Diese Dateien werden von der Suche ausgeschlossen:
$exclude_files = array('search.php','search_config.php','searchlog.txt','suchmaske.php');
// Wichtig: Hier müssen die Dateien dieses Scripts sein!!!

// Hier wird festegelegt ob in den Suchergebnissen der Dateiname
//oder der Dateititel ausgegeben wird
$filename = false;
//true, wenn immer filename ausgegeben werden soll.
//false, wenn title-tag ausgegeben werden soll.
//wenn die Datei kein title-tag oder ein leeres title-tag enthält,
//wird in jedem Fall filename ausgegeben.

// Hier wird festgelegt, welche Tags bei der Suche berücksichtig werden sollen

$key = true;
//true, wenn das meta tag keywords durchsucht werden soll, andernfalls false

$desc = true;
//true, wenn das meta tag description durchsucht werden soll, andernfalls false

$tit = true;
//true, wenn das meta tag title durchsucht werden soll, andernfalls false

$tags = true;
//true, wenn alle tags durchsucht werden sollen, andernfalls false

// Erst ab dem ersten vorkommen dieses Strings werden die Dateien durchsucht...
// damit lassen sich z.B. header, Menüs, include files etc. recht gut ausschließen
// hier bieten sich z.B an: '<h1> oder '<body>'
// wenn der $limit_start nicht im Dokument vorkommt,
// wird das Dokument von Anfang an durchsucht!
$limit_start = "";

// ... bis zu diesem String durchsuchen
// damit lassen sich z.B. footer ausschließen
$limit_end = "";

// unerwünschte Strings von der Suche ausschließen
$exclude_strings = array('Nichtfinden','externer Link:');

//Von hier an wird das Ausgabeformat des Suchergebnisses bestimmt
// so viele Buchstaben vor dem Treffer anzeigen:
$vor = 10;

// so viele Buchstaben nach dem Treffer anzeigen:
$nach = 50;

// wenn sowohl $vor als auch $nach auf 0 gesetzt wird, wird KEIN Kontext angezeigt,
// sondern nur der Link zur Datei mit dem Treffer

$jump = false; // Wenn hier "true" steht wird bei nur einem Suchergebnis dieses direkt angezeigt

// Anzahl der Treffer anzeigen:
$treffer = true; // $treffer = false; einsetzen, wenn Anzahl der Treffer nicht angezeigt werden soll.

// Anmerkung: Tags, die in <> eingeschlossen sind, werden NICHT durchsucht.
// dies gilt auch für html Kommentare, die mit <!-- Kommentare --> ausgezeichnet sind.

?>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Somit wäre wieder einmal ein von mir erstelltes Tutorial fertig.
Die Scripte sind alle kommentiert (Kommentare können ohne Bedenken gelassen werden)
Die Dateien können ohne weiteres an ihren Bedürftnissen angepasst werden und auch mit
Stylesheetangaben erweitert werden.

Bei Fragen wenden sie sich bitte unter folgender Adressen an mich: sebigisler@bluewin.ch
Ausserdem: ICQ=252-129-720

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Ich hoffe, dass mir dieses Tut gut gelungen ist, obwohl man von gewissen Platzproblemen
sprechen kann. Falls sie hier überhaupt nichts verstanden haben, können sie dieses Tutorial
auf meinen HPs nocheinmal anschauen:

http://sebigisler.lima-city.de/suchscript/suchfunktion.html
http://home.pages.at/sebigisler/suchfunktion.html

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Das fertige Script kann unter
http://sebigisler.lima-city.de/suchscript/suchmaske.php
getestet werden!

Bewertung Anzahl
6
44,4 %
4 Bewertungen
5
44,4 %
4 Bewertungen
1
11,1 %
1 Bewertungen