dass es sehr schade ist, dass Werner seine Seite eingestellt hat, werden vermutlich viele so sehen. Zu ändern ist es wohl nicht. Wohl dem, der eine Sicherung aller wichtigen Daten hat und man sieht, so ganz unvergesslich (insbesondere bei kleinen privaten Seiten) ist das Internet dann doch nicht.
Ich hatte mit Werner hin und wieder Kontakt und ein paar meiner Vorschläge sind in seine Suchmaschine eingeflossen, andere nicht.
Mein Problem ist, dass ich kein Programmierer sondern viel mehr ein Techniker bin, und mir jede einzelne Codezeile mühevoll einzeln zusammensuchen muss.
Ich stelle hier trotzdem mal das Suchmaschinen-Script von Werner ein, so wie ich es für mich angepasst habe.
Zu den Veränderungen:
Titelzeile angepasst.
Style verwende ich eigentlich aus einer externen Datei. Für hier habe ich ihn noch mal eingefügt.
Die HTML-Anzeige und Eingabe habe ich ganz entfernt.
Verzeichnis(se) und Vorzeichen sind jetzt ein Array. Es lassen sich somit mehrere parallel liegende Verzeichnisse und unterschiedliche Vorzeichen angeben.
Bei "unerwünschten" Suchanfragen wird diese nicht nur verworfen, es erfolgt auch eine Information.
Bereich <title> aus dem Textausschnitt (nicht Suche) entfernen sonst gab es zwei mal den selben Text (Titel im Link und Titel im Textausschnitt) auf der Ergebnisseite, wenn das gesuchte Wort im Anfangsbereich der Seite steht.
Im Dateilink "./" bzw. "../" nicht anzeigen.
Auf der Ergebnisseite "Es wurden XX Dateien bei der Suche nach XXX gefunden." eingefügt. (Weil bei mir Sucheingabe und Ergebnis in verschiedenen iFrames liegt.)
Das Suchwort auch im Dateipfad markieren.
Dateidatum im 24-Stunden Format anzeigen.
Automatische Weiterleitung bei nur einem Suchergebnis, angepasst.
Ich hoffe, dass ich an alles gedacht habe.
Verbesserungen gern melden, besonders die Zeilen 360 bis 364 find ich doof, ich habe aber keinen besseren Weg (schon weiter oben bei RecursiveDirectoryIterator) gefunden.
Viele Grüße
Detlef Paschke
Code: Alles auswählen
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0">
<title>Seitenname - Suche nach <?=(isset($_GET["suchbegriff"]) ? '"' . htmlspecialchars($_GET["suchbegriff"], ENT_HTML5, 'UTF-8') . '"' : ''); ?></title>
<!-- <link rel="stylesheet" href="./style.css" type="text/css"> -->
<style>
body {
font-family: Verdana, Arial, Tahoma, Sans-Serif;
font-size: 0.90rem;
}
/* Textausschnitt */
samp {
font-family: inherit;
font-style: Oblique;
}
/* Suchbegriff hervorheben */
mark {
background-color: #D5FFAA;
}
/* Datei-Info */
var {
color: #00AF02;
font-size: 0.7rem;
}
/* Suchergebnisse (Nummerierte Liste) */
li {
margin-top: 20px;
}
/* Meta-Tags */
cite {
font-family: inherit;
font-size: 0.7rem;
font-style: Normal;
}
/* Eingabefeld */
input[type="search"],
input[type="submit"] {
font-family: inherit;
font-size: 1.0rem;
line-height: 1.0;
border: 1px solid #7A7A7A;
transition: box-shadow 0.3s;
}
input[type="search"]:focus,
input[type="submit"]:focus {
border:0; outline:0; /* Chromium */
border: 1px solid #0078D7;
box-shadow: 0px 0px 4px 0px #2284E6;
line-height: 1.0;
}
</style>
</head>
<body>
<aside>
<?php
/* Die zu durchsuchenden Verzeichnisse eintragen, ausgehend
vom aktuellen Verzeichnis in dem diese Datei liegt.
Untereinander liegende Verzeichnisse müssen nicht einzelnen
aufgeführt werden. Bei parallel liegenden Verzeichnissen jeweils
das oberste gewünschte Verzeichnis angeben.
Aktuelles Verzeichnis durchsuchen mit "./" */
$verzeichnisse = [
// "./",
"./archiv",
];
/* Dateiendungen der Dateien, die gesucht werden sollen. */
$dateiendungen = [
".htm",
".html",
".php",
// ".txt",
// ".pdf",
// ".gif",
// ".jpg",
// ".png",
];
/* Dateiendungen in der oberen Liste, die keine "Textdateien" sind.
Auf der Ergebnisseite wird nur der Dateiname angezeigt. */
$_dateiendungen = [
".pdf",
".gif",
".jpg",
".png",
];
/* Vorzeichen bei Dateien die nicht durchsucht werden
sollen z.B. _intern.htm oder .login.php (nur 1 Zeichen) */
$vorzeichen = [
// ".",
// "_",
];
/* Einzelne Dateien die nicht durchsucht werden sollen */
$nicht_durchsuchen = [
// "privat.htm",
// "login.php",
];
/* Länge des minimalen Suchbegriffs */
$suchbegriff_min = 3; // 3
/* Länge des maximalen Suchbegriffs */
$suchbegriff_max = 100; // 100
/* Maximale Anzeige (Begrenzung) der Ergebnisse */
$suchergebnisse_max = 50; // 50
/* Unerwünschte Eingaben von der Suche ausschließen */
$ausschluss_eingaben = [
// "Demotext",
// "Demotext2",
];
/* Automatische Weiterleitung wenn nur eine Datei
gefunden wurde (ja/nein) */
$auto_weiterleitung = "ja"; // ja
/* Ziel in neuem Fenster/Tab öffnen.
Mit _blank wird ein neuer Tab geöffnet, _self öffnet im selben Fenster/Tab.
Möchte man unterschiedliche iFrame für Sucheingabe und Suchergebnis verwenden,
kann "_top" oder "_parent" verwendet werden. */
$target = "_self"; // leer oder _self
/* Tipps anzeigen wenn nichts gefunden wurde (ja/nein) */
$tipps_anzeigen = "ja"; // ja
/* Die Ergebnisse nach der letzten Dateiänderung sortieren (ja/nein).
Bei "nein" erfolgt die Sortierung nach der Anzahl der gefundenen Ergebnisse. */
$sortierung_dateiaenderung = "nein"; // nein
/* Ergebnis der Suche (Datum, Suchanfrage und Trefferzahl) speichern (ja/nein) */
$sucheingabe_speichern = "nein"; // nein
/* Name der Datei in der die Sucheingaben gespeichert werden.
Diese Datei wird beim ersten Eintrag autom. erzeugt! */
$suchdatei = "suchbegriffe.txt"; // suchbegriffe.txt
/* Bereits eingetragene Sucheingaben als Auswahl im
Formularfeld anzeigen (ja/nein)
$sucheingabe_speichern muss auf "ja" stehen! */
$datenliste_anzeigen = "nein"; // nein
/* Datei-Info - Letzte Änderung und Dateigröße (ja/nein) */
$datei_info = "ja"; // ja
/* Pfad-Info - Pfad anzeigen (ja/nein) */
$pfad_info = "ja"; // ja
/* Status-Info - Anzahl der durchsuchten Verzeichnisse
und Dateien anzeigen (ja/nein) */
$status_info = "nein"; // nein
/* Länge des angezeigten Textausschnitts */
$textausschnitt = 150; // 150 Zeichen
/* Treffer auf der gefundenen Seite hervorheben (ja/nein).
Diese Funktion wird noch nicht von allen Browsern unterstützt! */
$treffer_hervorheben = "ja"; // ja
/* Folgende Zeichen, Wörter oder HTML-Attribute aus dem
Textausschnitt ersetzen oder entfernen. */
$entfernung_zeichen = [
// 'Privat' => '',
];
/* Inhalt entfernen der zwischen den folgenden HTML-Tags liegt.
Dieser Inhalt wird nicht in der Suche berücksichtigt. */
$entfernung_inhalt = [
"h1", // <h1></h1>
"h3", // <h3></h3>
"nav", // <nav></nav>
// "head", // <head></head>
// "footer", // <footer></footer>
];
/* Einen bestimmten HTML-Bereich für die Suche definieren
z.B.: body, main oder article.
Leer lassen wenn diese Option nicht verwendet werden soll. */
$suche_in_bereich = "";
/* META-Tags, wenn diese vorhanden sind, anzeigen (ja/nein).
Z. B. der Inhalt vom 'content'-Attribut: <meta name="description" content="Beschreibung der Seite."> */
$metatags_anzeigen = "nein"; // nein
/* META-Tags in die Suche einschließen (ja/nein) */
$metatags_durchsuchen = "nein"; // nein
/* Diese META-Tags durchsuchen */
$metatags_attribute = [
"description",
// "keywords",
// "author",
// "date",
];
/* Zeitzone setzen (siehe: http://php.net/manual/de/timezones.europe.php) */
date_default_timezone_set("Europe/Berlin");
/* PHP-Fehlermeldungen anzeigen (0/E_ALL) */
error_reporting(0); // 0
$datenliste = "";
if (
$sucheingabe_speichern == "ja" &&
$datenliste_anzeigen == "ja" &&
file_exists($suchdatei)
) {
$datenliste = [];
foreach (file($suchdatei, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES) as $element) {
list($datum, $begriff, $anzahl) = explode('|', $element);
if ($anzahl > 0) {
$datenliste[] = $begriff;
}
}
sort($datenliste);
$datenliste = '<datalist id="liste"><option>' . implode('<option>', array_unique($datenliste)) . '</datalist>';
}
// Formular anzeigen
echo '<p>';
echo '<form method="get" action="#Form" id="Form">
<input type="search" name="suchbegriff" placeholder="Suchbegriff eingeben" value="' .
(isset($_GET["suchbegriff"]) ? htmlspecialchars($_GET["suchbegriff"], ENT_HTML5, 'UTF-8') : '') .
'" size="35" minlength="' . $suchbegriff_min . '" maxlength="' . $suchbegriff_max . '" list="liste" required="required" spellcheck="true">
' . $datenliste . '
<input type="submit" name="suche" value="suchen">
</form>
';
$suchergebnisse = [];
$gefunden = 0;
$anzahl_dateien = 0;
$hyperlink = "";
$directories = [];
$filter = '/\.(?:' . str_replace(".", "", implode("|", $dateiendungen)) . ')$/i';
$startzeit = microtime(true);
$url = 'http' . (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == 'on' ? 's' : '') . '://' . $_SERVER["HTTP_HOST"] . dirname($_SERVER["SCRIPT_NAME"]);
array_push($nicht_durchsuchen, basename($_SERVER["SCRIPT_NAME"]));
if (
isset($_GET["suche"]) ||
isset($_GET["suchbegriff"])
) {
$_GET["suchbegriff"] = rawurldecode($_GET["suchbegriff"]);
$_GET["suchbegriff"] = str_replace([',', '.', ':', ';', '!', '?', '"', "'", "\t"], '', preg_replace('/\s\s+/', ' ', trim($_GET["suchbegriff"])));
foreach ($ausschluss_eingaben as $ausschluss) {
if (mb_strtolower($_GET["suchbegriff"]) == mb_strtolower($ausschluss)){
echo '<p>Die Suchanfrage <i>' . $_GET["suchbegriff"] . '</i> ist unerwünscht und wird verworfen.</p>';
$_GET["suchbegriff"] = trim(($_GET["suchbegriff"]), "\x00..\xFF");
}
}
if (
mb_strlen($_GET["suchbegriff"]) >= $suchbegriff_min &&
mb_strlen($_GET["suchbegriff"]) <= $suchbegriff_max
) {
foreach ($verzeichnisse as $verzeichnis) {
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($verzeichnis)
);
$dateifilter = new RegexIterator($iterator, $filter);
foreach ($dateifilter as $zeiger) {
if ($zeiger->isFile()) {
$datei = $zeiger->getPathname();
$dateiname = $zeiger->getBasename();
$dateiendung = '.' . $zeiger->getExtension();
if (!in_array(dirname($zeiger->getPathname()), $directories)) {
$directories[] = dirname($zeiger->getPathname());
}
if (
!in_array(substr($dateiname, 0, 1), $vorzeichen) &&
!in_array($dateiname, $nicht_durchsuchen)
) {
$text = (!in_array($dateiendung, $_dateiendungen)) ? file_get_contents($datei) : mb_substr(strtoupper($dateiendung), 1) . '-Datei';
preg_match('/<title>(.*?)<\/title>/is', $text, $treffer);
$titel = isset($treffer[1]) ? $treffer[1] : $dateiname;
unset($treffer[1]);
$anzahl_dateien++;
$meta = ($metatags_anzeigen == "ja" && count(get_meta_tags($datei)) > 0) ? '<br><cite>➧ ' . implode(' ➧ ', get_meta_tags($datei)) . '</cite>' : '';
if ($metatags_durchsuchen == "ja" && get_meta_tags($datei)) {
$metatag_array = get_meta_tags($datei);
foreach ($metatags_attribute as $attribut) {
if (isset($metatag_array[$attribut])) $text .= ' [' . $attribut . ': ' . $metatag_array[$attribut] . ']';
}
}
$text = strtr($text, $entfernung_zeichen);
if (!empty($suche_in_bereich)) {
preg_match('/<' . $suche_in_bereich . '>(.*?)<\/' . $suche_in_bereich . '>/Usi', $text, $bereich);
$text = isset($bereich[1]) ? $bereich[1] : '';
}
foreach ($entfernung_inhalt as $htmltag) {
$text = preg_replace('/\<' . $htmltag . '\>(.*)\<\/' . $htmltag . '\>/Usi', '', $text);
}
// Bereich <title> im Textausschnitt (nicht in der Suche) entfernen um Doppelungen auf der Ergebnisseite zu vermeiden.
$textteil = preg_replace('/<title>(.*?)<\/title>/is', '', $text);
$textteil = strip_tags(html_entity_decode($textteil));
$text = strip_tags(html_entity_decode($text));
$preg = explode(" ", $_GET["suchbegriff"]);
if (strstr($_GET["suchbegriff"], "-")) $preg = explode("-", $_GET["suchbegriff"]);
$pregCount = count($preg);
$preg = implode(".*?|", $preg);
if ((mb_strstr($text, $_GET["suchbegriff"]) or
mb_stristr($text, $_GET["suchbegriff"]) or
mb_stristr($text, mb_strtolower($_GET["suchbegriff"])) or
mb_stristr($dateiname, $_GET["suchbegriff"]) or
preg_match("/" . $preg . "/is", $text)) &&
$gefunden <= $suchergebnisse_max
) {
$gefunden++;
$hyperlink = $url . str_replace(['../', './'], '', $datei);
$start = mb_strpos(mb_strtolower($textteil), mb_strtolower($_GET["suchbegriff"])) - $textausschnitt;
if ($start < 0) $start = 0;
$ende = mb_strlen($_GET["suchbegriff"]) + $textausschnitt * 2;
$textteil = mb_substr($textteil, $start, $ende);
$textteil = (mb_strlen($texteil) > $textausschnitt ? mb_substr($textteil, mb_strpos($textteil, $_GET["suchbegriff"]), $textausschnitt) : $textteil);
$treffer = mb_substr_count(mb_strtolower($text), mb_strtolower($_GET["suchbegriff"]));
$worte = preg_split('/[\s]+/', $_GET["suchbegriff"]);
foreach ($worte as $wort) {
$textteil = preg_replace('/(' . $wort . ')/i', "<mark>$1</mark>", $textteil);
$titel = preg_replace('/(' . $wort . ')/i', "<mark>$1</mark>", $titel);
$hyperlink = preg_replace('/(' . $wort . ')/i', "<mark>$1</mark>", $hyperlink);
}
$suchergebnisse[($sortierung_dateiaenderung == "ja" ? date("Y-m-d H:i:s", filemtime($datei)) : sprintf("%02s", $treffer) . sprintf("%02s", $gefunden))] =
'<li><a href="' . $hyperlink . ($treffer_hervorheben == "ja" ? '#:~:text=' . $_GET["suchbegriff"] : '') . '" target="' . $target . '">' . $titel . '</a> <small>(' . ($treffer == 0 ? 1 : $treffer) . 'x)</small>' . $meta . '<br><samp>… ' . $textteil . ' …</samp>' .
($datei_info == "ja" ? '<br><var>Erstellt: ' . date("d.m.Y H:i", filemtime($datei)) . ' - ' . number_format((filesize($datei) / 1024), 1, ",", ".") . ' KB' . ($pfad_info == "ja" ? ' - ' . $hyperlink : '') . '</var>' : '') .
'</li>';
}
}
}
}
}
// Doppelungen in den Suchergebnissen entfernen. (Wenn fehlerhaft untereinander liegende Verzeichnisse angegeben werden.)
$suchergebnisse = array_unique($suchergebnisse);
if (count($suchergebnisse) != $gefunden){
$gefunden = count($suchergebnisse);
}
// Ergebnisse nach Anzahl der Treffer oder der letzten Dateiänderung sortieren
krsort($suchergebnisse);
$suchergebnisse = implode($suchergebnisse);
// Ergebnis der Suche speichern
if ($sucheingabe_speichern == "ja") {
$fh = fopen($suchdatei, "a+");
fputs($fh, date("d.m.Y H:i") . '|' . htmlspecialchars($_GET["suchbegriff"], ENT_HTML5, 'UTF-8') . '|' . $gefunden . "\n");
fclose($fh);
}
// Keine oder nur eine Übereinstimmung gefunden
if ($gefunden == 0) {
echo '<p>Es wurden keine Übereinstimmungen bei der Suche nach <i>' . htmlspecialchars($_GET["suchbegriff"], ENT_HTML5, 'UTF-8') . '</i> gefunden.</p>';
// Tipps anzeigen
if ($tipps_anzeigen == "ja") {
echo '<p>Tipp: Beachten Sie die Rechtschreibung';
if (strtolower($_GET["suchbegriff"]) != $_GET["suchbegriff"]) {
echo ', verwenden Sie nur Kleinbuchstaben';
}
if (
isset($pregCount) &&
$pregCount > 1
) {
echo ' oder verwenden Sie einen einzelnen Suchbegriff';
}
echo '!</p>';
}
} else {
// Automatische Weiterleitung bei einer Übereinstimmung
if (
$auto_weiterleitung == "ja" &&
$gefunden == 1
)
{
$meta_tags = get_meta_tags($hyperlink);
if (isset($meta_tags['description'])) {
$beschreibung = $meta_tags['description'];
}
exit('<p>Es wurde '. $gefunden . ' Datei bei der Suche nach <i> ' . htmlspecialchars($_GET["suchbegriff"], ENT_HTML5, 'UTF-8') . '</i> gefunden.</p>
<p>Die Datei wird in 5 Sekunden automatisch geladen...<br>
<a href="' . $hyperlink . ($treffer_hervorheben == "ja" ? '#:~:text=' . $_GET["suchbegriff"] : '') . '" target="' . $target . '">' . $hyperlink . '</a><br><small><samp>… ' . $beschreibung . ' …</samp></small><meta http-equiv="refresh" content="5; URL=' . $hyperlink . ($treffer_hervorheben == "ja" ? '#:~:text=' . $_GET["suchbegriff"] : '') . '">');
}
// Ausgabe der Suchergebnisse
echo '<p>Es ' . ($gefunden == 1 ? 'wurde '. $gefunden . ' Datei' : 'wurden ' . $gefunden . ' Dateien') . ' bei der Suche nach <i>' . htmlspecialchars($_GET["suchbegriff"], ENT_HTML5, 'UTF-8') . '</i> gefunden.</p>' .
'<ol>' . $suchergebnisse . '</ol>';
}
// Datei-Info anzeigen
if ($status_info == "ja") {
printf('<p>In %.2f Sekunden ' . (count($directories) == 1 ? 'wurde '. count($directories) . ' Verzeichnis mit ' : 'wurden ' . count($directories) . ' Verzeichnisse mit ') . $anzahl_dateien . ($anzahl_dateien == 1 ? ' Datei ' : ' Dateien ') . 'durchsucht.</p>', microtime(true) - $startzeit);
}
}
// Länge des Suchbegriffs zu kurz/zu lang
else {
echo '<p>Es sind ' . (mb_strlen($_GET["suchbegriff"]) < $suchbegriff_min ?
'mindestens ' . $suchbegriff_min . ' Zeichen nötig' :
'maximal ' . $suchbegriff_max . ' Zeichen erlaubt') . '!</p>';
}
}
?>
</aside>
</body>
</html>