Suchskript modifizieren

Hallo zusammen,

ich benutze folgendes Suchskript: http://www.planetc.de/download/planetsearch/planetsearch.html; zum Testen http://suche.elpixo.de/.

Das Skript bietet mir die Möglichkeit, Ordner von der Suche auszuschließen. Jetzt möchte ich noch eine bestimmte Datei von der Suche ausschließen.

Kann man das Skript dahingehend umändern? Wenn ja, wäre jemand vielleicht so nett? Danke.

Gruß elsner

config.inc.php (Auszug):

// Verzeichnisse, die von der Suche AUSGESCHLOSSEN werden sollen // Die Unterverzeichnisse des angegebenen Verzeichnisses werden // ebenfalls von der Suche ausgeschlossen. // VOR dem Verzeichnis KEIN Slash (/), NACH dem Verzeichnis EIN Slash (/) $ignore_dir = array('ordner/');
suche.php (Auszug):

[code]# Function für den Verzeichnisdurchlauf und die Trefferermittlung
function walk_dir($dir, $pos=2)
{

global $search_exp, $search_arr, $search_count, $arr, $ignore_dir, $dat_type, $root_dir, $search_area, $cont_part, $no_title, $search_pages, $arr_all;

 $handle = @opendir($dir);
 while ($file = @readdir ($handle)) 
 {
    if (preg_match("=^\.{1,2}$=",$file))
    {
      continue;
    }

	$cut_dir = preg_replace("=$root_dir=siU", "", $dir); // Verzeichnisse zum Vergleich anpassen
	if (in_array($cut_dir, $ignore_dir)) continue; // zu ignorierende Verzeichnisse auslassen
	if (preg_match('=(_vti_cnf|_notes)=i', $cut_dir)) continue;

	if(is_dir($dir.$file))
    {
      walk_dir($dir.$file."/", $pos + 3);               
    }
    else
    {[/code]

Falls noch irgendwelche Daten hilfreich sind, liefere ich sie gerne nach.

Da ich mir momentan nicht anders zu helfen weiß, habe ich den Inhalt der zu ignorierenden Datei in eine gesonderte Datei gepackt und diesen Inhalt wiederum in die Ursprungsdatei inkludiert.

Damit erreiche ich den gewünschten Effekt, der Inhalt der besagten Datei wird bei der Suche nicht berücksichtigt.

Aber diese Lösung finde ich nicht so sauber und den “Datei-Ausschluss” würde ich gerne noch ins Suchskript integrieren. Vielleicht kann mir dabei noch jemand helfen.

[quote=“mikebeblack”][code]
// Verzeichnisse, die von der Suche AUSGESCHLOSSEN werden sollen
// Die Unterverzeichnisse des angegebenen Verzeichnisses werden
// ebenfalls von der Suche ausgeschlossen.
// VOR dem Verzeichnis KEIN Slash (/), NACH dem Verzeichnis EIN Slash (/)
$ignore_dir = array(‘ordner/’);

$ignore_files = array(‘ordner/datei.htm’);
[/code]

[code]# Function für den Verzeichnisdurchlauf und die Trefferermittlung
function walk_dir($dir, $pos=2)
{

global $search_exp, $search_arr, $search_count, $arr, $ignore_dir, $dat_type, $root_dir, $search_area, $cont_part, $no_title, $search_pages, $arr_all;

 $handle = @opendir($dir);
 while ($file = @readdir ($handle)) 
 {
    if (preg_match("=^\.{1,2}$=",$file))
    {
      continue;
    }

	$cut_dir = preg_replace("=$root_dir=siU", "", $dir); // Verzeichnisse zum Vergleich anpassen
	if (in_array($cut_dir, $ignore_dir)) continue; // zu ignorierende Verzeichnisse auslassen
	if (preg_match('=(_vti_cnf|_notes)=i', $cut_dir)) continue;

	if(is_dir($dir.$file))
    {
      walk_dir($dir.$file."/", $pos + 3);               
    }
    else if(in_array($dir.$file, $ignore_files) == false)
    {[/code]

So sollte das eigentlich funktionieren…[/quote]
Vielen Dank für deine Hilfe. Leider funktioniert es nicht. Die zu ignorierende Datei wird weiterhin aufgeführt. Hast du eine Idee, woran das liegt?

Den ersten Teil habe ich 1 zu 1 übernommen. Der zweite sieht folgendermaßen aus:

[code]# Function für den Verzeichnisdurchlauf und die Trefferermittlung
function walk_dir($dir, $pos=2)
{

global $search_exp, $search_arr, $search_count, $arr, $ignore_dir, $ignore_files, $dat_type, $root_dir, $search_area, $cont_part, $no_title, $search_pages, $arr_all;

 $handle = @opendir($dir);
 while ($file = @readdir ($handle)) 
 {
    if (preg_match("=^\.{1,2}$=",$file))
    {
      continue;
    }

  $cut_dir = preg_replace("=$root_dir=siU", "", $dir); // Verzeichnisse zum Vergleich anpassen
  if (in_array($cut_dir, $ignore_dir)) continue; // zu ignorierende Verzeichnisse auslassen
  if (preg_match('=(_vti_cnf|_notes)=i', $cut_dir)) continue;

  if(is_dir($dir.$file))
    {
      walk_dir($dir.$file."/", $pos + 3);               
    }
    else if(in_array($dir.$file, $ignore_files) == false)
    {

[/code]

[quote=“mikebeblack”]Wahrscheinlich ist der pfa zur Datei nicht genau $dir.$file .
Villeicht könntest du dir einfach mal ausgeben lassen was $dir.$file ist (mit echo),
dann sollte das eigentlich ganz einfach zu lösen sein.[/quote]
Nochmals danke für deine schnelle Reaktion.

Aber wie lasse ich es mir ausgeben bzw. wie muss das echo aufgebaut sein? Mein echo gibt mir nur den Teil zwischen den Hochklammern aus ($dir.$file).

Endlich mal ein bisschen mit der Materie umgehen zu lernen, könnte doch wohl nicht schaden, wenn du andauernd neue Anforderungen für deine Seite umsetzen willst, oder?

Natürlich, weil ja unsinnigerweise Hochkommata drumherum stehen.

Der obrige Code müsste doch sinngemäß jetzt stimmen, oder?

Aber es wird nichts ausgegeben. Ich habe versuchsweise eine Variable im Suchskript definiert und diese wurde auch auf der ausgegebenen Seite richtige ausgegeben.

Der obrige Code müsste doch sinngemäß jetzt stimmen, oder?

Aber es wird nichts ausgegeben. Ich habe versuchsweise eine Variable im Suchskript definiert und diese wurde auch auf der ausgegebenen Seite richtige ausgegeben.

[quote=“mikebeblack”][quote=“elsner”]echo $dir.$file;
Der obrige Code müsste doch sinngemäß jetzt stimmen, oder?
[/quote]

Ja, der stimmt auch. Vielleicht hast du ihn so in der Datei untergebracht , dass es sich um unerreichbaren Code handelt oder dass die variablen an der entsprechenden Stelle (noch) nicht definiert (== “”) sind?[/quote]
Das kann ich mir gar nicht vorstellen.

Da gibt es ja das eigentliche Suchskript, welches die ganzen Funktionen durchführt. Nach der Suchfunktion inkludiert das Skript dann eine Seite (Ergebnisse oder Fehler). Den echo-Befehl habe ich bei der Ergebnisseite eingebunden.

Meiner Meinung nach müsste doch dann schon etwas drinstehen. Jedenfalls würde das “noch nicht” nicht passen.

Kann es vielleicht sein, dass das Skript den Inhalt der Variable wieder löscht, also das ich den echo-Befehl zu spät einbinde? (Nur eine Idee)

Genau das war ja die Frage.

Und natürlich enthält zumindest $file nach der Schleife false, weil genau das der Rückgabewert ist, den readdir liefert, wenn es keine weiteren Einträge mehr gibt. (Gut, das würde noch nicht erklären, warum $dir auch nichts mehr liefert. Aber dass auch das in dem Kontext, in dem du die Kontrollausgabe gemacht hast, nicht verfügbar ist, ist ja nicht so unwahrscheinlich.)

Warum bringst du es nicht an der Stelle unter, an der das Problem besteht?

Weitere Hinweise, dass du den Umgang mit der Technik wenigstens mal in Grundzügen lernen solltest, kann ich mir wohl sparen - ignorierst du ja sowieso.
Aber du musst doch langsam auch selber mal merken, dass du so kaum weiterkommst, und immer darauf angewiesen sein wirst, dir fertige Lösungen von anderen zu schnorren, wenn du dich nicht mal ein bisschen damit beschäftigst …

Genau das war ja die Frage.

Und natürlich enthält zumindest $file nach der Schleife false, weil genau das der Rückgabewert ist, den readdir liefert, wenn es keine weiteren Einträge mehr gibt. (Gut, das würde noch nicht erklären, warum $dir auch nichts mehr liefert. Aber dass auch das in dem Kontext, in dem du die Kontrollausgabe gemacht hast, nicht verfügbar ist, ist ja nicht so unwahrscheinlich.)

Warum bringst du es nicht an der Stelle unter, an der das Problem besteht?[/quote]
Weil ich dachte, dass dadurch nichts ausgegeben wird.

Jetzt habe ich den echo-Befehl mal an mehreren Stellen im Suchskript direkt eingebaut. Leider wurde mich nichts ausgegeben oder mir wurde ein Syntax-Fehler erzeugt.

Vielleicht hilft es ja, hier das Suchskript:[code]<?php
###########################################################

© PlaNet Concept e.K., Lars Odermath, 2003

###########################################################

:: planetSearch :: Version vom 05.10.2003

COPYRIGHT NOTICE

Copyright 2003 PlaNet Concept e.K.

All Rights Reserved.

EMail: kontakt@planetc.de

URL : http://www.planetc.de

:: planetSearch :: darf für private Homepages kostenlos benutzt und geändert

werden, solange SÄMTLICHE Copyright-Verweise und die restlichen Kommentare erhalten

bleiben.

Mit dem Einsatz dieses Skripts akzeptieren Sie, daß PlaNet Concept e.K.,

Lars Odermath, von jeglicher Haftung und Gewährleistung hinsichtlich des

Einsatzes befreit ist.

Der Verkauf dieses Skripts, auch in modifizierter Form, ist ohne vorherige

Absprache ausdrücklich untersagt! (Mit anderen Worten: Bitte fragen Sie uns,

bevor Sie versuchen, mit unserem Script Geld zu verdienen.)

Sollten Sie den Copyright-Verweis in der Ausgabe des Scriptes nicht anzeigen

oder das Script auf kommerziellen Seiten einsetzen wollen, können Sie dies gegen die

Entrichtung einer Lizenz-Gebühr in Höhe von € 36,00 zzgl. der gesetzl. MWSt. tun.

Senden Sie uns dazu bitte eine eMail und geben u.a. die URL für das Script an.

Sie erhalten dann umgehend eine Rechnung von uns.

BITTE LESEN UND BEACHTEN SIE UNSERE NUTZUNGSBEDINGUNGEN FÜR DIE SCRIPTE!!!

Die Nutzungsbedingungen finden Sie in der der beigefügten “nutzungsbedingungen.txt”

und unter http://www.planetc.de/download/nutzungsbedingungen.html

###########################################################
###########################################################

#############################
include ("./inc/config.inc.php");
#############################
$root_dir = $_SERVER[“DOCUMENT_ROOT”].$from_dir."/";

@setlocale(“LC_ALL”, “de_DE”);

Suchbegriff(e) übernehmen und umwandeln

$search_exp = strip_tags($_POST[“search_exp”]);

#############################
#Prüfen, ob ein Suchbegriff eingegeben wurde

if (!empty($search_exp)) {

Sonderzeichen entfernen

$frrepl = array("=+=", “=\s+=”);
$torepl = array("", " ");
$search_exp = preg_replace( $frrepl, $torepl, $search_exp);
$search_exp = preg_quote($search_exp);
$search_exp = trim($search_exp);

Zeichenanzahl des Suchbgeriffes prüfen

if (strlen($search_exp) < $sexp_length) {
// Template laden
$tmpl = join(’’, file("./tmpl/search_error.htm"));
$tmpl = preg_replace("=[search_error_count]=", $error_count, $tmpl);
$tmpl = preg_replace("=[search_error_empty]=", “”, $tmpl);
eval(’?>’ . $tmpl);
} else {

Suchbegriffe in Array umwandeln und zählen

$search_arr = explode(" ",$search_exp);
$search_count = count($search_arr);

“Dummy”-Array für Such-Array erzeugen

$arr = array();
$arr_all = array();

Template laden

$tmpl = join(’’, file("./tmpl/search_result.php"));

Bereich der Trefferanzeige aus dem Template ziehen

preg_match_all("=[SEARCH_START](.*)[SEARCH_STOP]=siU", $tmpl, $between);

$search_pages = 0;

$cont_part = walk_dir($root_dir); // Verzeichnisdurchlauf starten

$search_pages = count($cont_part); // Anzahl der Trefferseiten

rsort($cont_part); // Array sortieren

for ($j=0; $j<$search_pages; $j++) { // Arrays auslesen
list($anz_searchexp, $title, $descr, $new_path) = $cont_part[$j];
$content = preg_replace("=[SEARCH_TITLE]=", “$title”, $between[1][0]);
$content = preg_replace("=[SEARCH_LINK]=", “$from_dir”."$new_path", $content);
$content = preg_replace("=[SEARCH_DESC]=", “$descr”, $content);
$content = preg_replace("=[SEARCH_COUNT]=", “$anz_searchexp”, $content);
$cont_x .= $content;
}

// Suchergebnis zusammenstellen und anzeigen
$tmpl = preg_replace("=[SEARCH_START](.*)[SEARCH_STOP]=siU", $cont_x, $tmpl);
$search_exp = str_replace(’\’, ‘’, $search_exp);
$tmpl = preg_replace("=[SEARCH_WORDS]=", $search_exp, $tmpl);
$tmpl = preg_replace("=[SEARCH_PAGES]=", $search_pages, $tmpl);

if (empty($cont_part)) {
$tmpl = preg_replace("=[NO_MATCH]=", $no_match, $tmpl);
} else {
$tmpl = preg_replace("=[NO_MATCH]=", “”, $tmpl);
}

eval(’?>’ . $tmpl);

#################################################

Logdatei schreiben

foreach ($search_arr as $search_exp) {

$zeilen = file("./_log/search_log.txt");
$anz_zeilen = sizeof($zeilen);

$x=0;

Datenfile auslesen

for ($i=0; $i<$anz_zeilen; $i++) {

list ($search_word, $search_num) = split("\\|", chop($zeilen[$i]));	

// wenn Suchbegriff gefunden wird
if ($search_exp==$search_word) {
	$search_num++;
	$i-2;
	$x++;
}
    $new_log .= "$search_word|$search_num\n";

}

// wenn der Suchbegriff nicht schon geloggt wurde
if ($x==0) {
$search_num = “1”;
$new_log .= “$search_exp|$search_num\n”;
}

$data = fopen("./_log/search_log.txt",“w+”);
flock($data,1);
fwrite($data, $new_log);
flock($data,3);
fclose($data);
unset($new_log);
}
#################################################

}
}
#############################

Wenn kein Suchbegriff eingegeben wurde

else {
# Template laden
$tmpl = join(’’, file("./tmpl/search_error.htm"));
$tmpl = preg_replace("=[search_error_count]=", “”, $tmpl);
$tmpl = preg_replace("=[search_error_empty]=", $error_empty, $tmpl);
eval(’?>’ . $tmpl);
}
#############################

#################################################

Function für den Verzeichnisdurchlauf und die Trefferermittlung

function walk_dir($dir, $pos=2)

{

global $search_exp, $search_arr, $search_count, $arr, $ignore_dir, $ignore_files, $dat_type, $root_dir, $search_area, $cont_part, $no_title, $search_pages, $arr_all;

 $handle = @opendir($dir);
 while ($file = @readdir ($handle)) 
 {
    if (preg_match("=^\.{1,2}$=",$file))
    {
      continue;
    }

  $cut_dir = preg_replace("=$root_dir=siU", "", $dir); // Verzeichnisse zum Vergleich anpassen
  if (in_array($cut_dir, $ignore_dir)) continue; // zu ignorierende Verzeichnisse auslassen
  if (preg_match('=(_vti_cnf|_notes)=i', $cut_dir)) continue;

  if(is_dir($dir.$file))
    {
      walk_dir($dir.$file."/", $pos + 3);               
    }
    else if(in_array($dir.$file, $ignore_files) == false)
    {
    #########################################
	# Suche und Trefferanzeige
	#########################################
	$abs_dir = preg_replace("=$root_dir=","",$dir);		// absoluten Pfad ermitteln
	
	if (preg_match("=(\.$dat_type)$=",$file)) {		// wenn eine Datei eine zulässige Endung hat...

	$str = join('', file("$dir$file"));		// ...Datei einlesen


	if (!preg_match("=\<\!\-\-.no_search.\-\-\>=siU", $str)) { // auf auszuschließende Seiten prüfen

	$str = ch_uml($str); // Umlaute verarbeiten

	// Titel ermitteln
	preg_match("=<title>(.*)</title>=siU", $str, $title);

	// Meta-Beschreibung ermitteln
	preg_match('=<meta.*name\="description".*content\="(.*)".*>=siU',$str,$descr);

	// Keywords
	preg_match('=<meta.*name\="keywords".*content\="(.*)".*>=siU',$str,$keyw);

	// zu durchsuchender Bereich
	if ($search_area==1) {	// Titel, Description, Keywords
		$a = "$title[1]"."$descr[1]"."$keyw[1]"; 
	}
	else {	// alles
		$str = preg_replace("=\<\!\-\-.no_search_start.\-\-\>.*?\<\!\-\-.no_search_stop.\-\-\>=s", "", $str);
		$a = preg_replace("=<script.*>.*<\/script>=siU", "", $str); // JavaScript-Code entfernen
		$a = preg_replace("=<\?.*?\?>=s", "", $a); // PHP-Tags löschen um nur Text zu durchsuchen
	    $a = preg_replace("=(<[^>]+>)=siU", "", $str); // Tags löschen um nur Text zu durchsuchen
		$a .= "$title[1]"."$descr[1]"."$keyw[1]";
	}

	$i=0;

	foreach ($search_arr as $search_word) {		// jeden Suchbegriff prüfen
	if (preg_match("=($search_word)=i", $a)) {		// wenn Suchbegriff vorkommt...

		$anz_searchexp += preg_match_all("=$search_word=siU", $a, $nullinger);

	$i++;		// i für jeden gefundenen Suchbegriff erhöhen

	if ($i==$search_count) {		// wenn ALLE Suchbegriffe gefunden wurden...


		if (!empty($title[1]))		// Title der Seite auslesen
		{
			$new_title = "$title[1]";
			$new_path = "/$abs_dir$file";
		}
		else {
			$new_title = "$no_title";
			$new_path = "/$abs_dir$file";
		}

		if (!empty($descr[1]))	// description auslesen
		{
			$new_descr = "$descr[1]";
		}
		else {
			$new_descr = "";
		}

	if (!preg_match("=^\(\.\*\)$=", $new_title)) {
		$s_show = array();
		$s_show[] = $anz_searchexp;
		$s_show[] = $new_title;
		$s_show[] = $new_descr;
		$s_show[] = $new_path;
		array_push($arr_all, $s_show);
	}

	unset($str, $anz_searchexp);
	}
	}
	}
}

}
#########################################
#########################################
}
}
$cont_part = $arr_all;
return ($cont_part);
@closedir($handle);
}

Funktion ende

#################################################

// Umlaute bearbeiten
function ch_uml($del_uml) {
$del_uml = preg_replace("=ä=", “ä”, $del_uml); // Umlaute und ß
$del_uml = preg_replace("=ö=", “ö”, $del_uml);
$del_uml = preg_replace("=ü=", “ü”, $del_uml);
$del_uml = preg_replace("=Ä=", “Ä”, $del_uml);
$del_uml = preg_replace("=Ö=", “Ö”, $del_uml);
$del_uml = preg_replace("=Ü=", “Ü”, $del_uml);
$del_uml = preg_replace("=ß=", “ß”, $del_uml);
return ($del_uml);
} // end func

#################################################
?>[/code]

[quote=“chrisb”]Weitere Hinweise, dass du den Umgang mit der Technik wenigstens mal in Grundzügen lernen solltest, kann ich mir wohl sparen - ignorierst du ja sowieso.
Aber du musst doch langsam auch selber mal merken, dass du so kaum weiterkommst, und immer darauf angewiesen sein wirst, dir fertige Lösungen von anderen zu schnorren, wenn du dich nicht mal ein bisschen damit beschäftigst …[/quote]
Nein, diese werden nicht gänzlich ignoriert. Ich weiß, dass ich von der Materie eigentlich nicht verstehe und auf Andere angewiesen bin. Aber meine Prioritäten liegen (derzeit) woanders.

if(is_dir($dir.$file)) { walk_dir($dir.$file."/", $pos + 3); } echo isset($dir); echo isset($file); else if(in_array($dir.$file, $ignore_files) == false) {
Erzeugt leider eine Fehlermeldung

Parse error: syntax error, unexpected T_ELSE in /home/www/web167/html/suche/planetsearch.php on line 202

[quote=“mikebeblack”]Oh, tschuldigung ich kann natürlich einen if-else block nicht mit echo unterbrechen…

so ist’s richtig:

echo isset($dir); echo isset($file); if(is_dir($dir.$file)) { walk_dir($dir.$file."/", $pos + 3); } else if(in_array($dir.$file, $ignore_files) == false) {[/quote]
Kein Problem.

Aber leider erscheint immer noch nichts. Siehe http://suche.elpixo.de/planetsearch.php (direkt auf’s Suchskript verlinkt).

Nein, per GET aufgerufen nicht.

Aber dein Suchscript soll ja auch per POST übergebene Daten auswerten, und deshalb liegt der ganze Scriptteil, der hier diskutiert wird, wohl in einem Bereich, der nur abhängig vom Vorhandensein von POST-Daten ausgeführt wird.

POSTet man jedoch Daten an das Script, dann wird oben noch vor dem eine Reihe von Einsen ausgeben - das ist die positive boole’sche Rückgabe eines isset-Ausdrucks, in einen für die Ausgabe per echo erforderlichen String-Kontext konvertiert.
Allerdings wird der false-Wert bei der gleichen Konvertierung zu einem Leerstring, so dass an der Ausgabe immer noch nicht erkennbar ist, ob einer der beiden isset-Ausdrücke falsch lieferte …

[quote=“mikebeblack”]Also löschst du einfach erst das erste isset() , und postest was dann rauskommt.
anschließend machst du es mit dem zweiten auch genau so.[/quote]
Also, ich hatte jetzt immer nur einmal das isset() drinstehen. Aber es wird trotzdem nichts ausgegeben.

Muss ich noch etwas anderes ändern, wegen der letzten Anmerkung von chrisb?

[quote=“mikebeblack”]Ja du musst die Datei immer via POST aufrufen.
Das machst du entweder mit einem speziellen Tool oder indem du in das Suchformular etwas eingibst und dann auf OK gehst.[/quote]
Juhu, vielen Dank. Die Ausgabe hat endlich funktioniert.

$dir zeigt:

$file zeigt:

Kann man den Pfad zur Datei nicht anders angeben? Wenn ich das richtig interpretiere, lautet mein Pfad: home/www/web167/html/suche/.

Edit: Meine Interpretation stimmt, mit oben angegebenem Pfad wird die Datei ignoriert. Aber ein relativer Pfad wäre mir wesentlich lieber. Gibt es da eine einfache Lösung?