Re: Suchscript von Werner
Verfasst: Sa 27. Aug 2022, 18:05
Bei mir funktioniert das:
Forum für Mobirise und NOF
https://www.mobirise-tutorials.com/Forum/
https://www.mobirise-tutorials.com/Forum/viewtopic.php?t=778
Dann weiß ich auch nicht, warum es hier geht. Ist bei mir auch ein ganz normaler Tab mit Notepad++ gemacht.Werner-Zenk.de hat geschrieben: ↑Sa 27. Aug 2022, 18:05 Bei mir funktioniert das:
skript_sammler.png
Hallo Tommy,Tommy Herrmann hat geschrieben: ↑So 28. Aug 2022, 08:15 Moin,
also bei mir wird das auch zusammenhängend und auch einzeln gezeigt, was ich auch vollkommen OK finde, denn Hauptsache es wird gefunden.
Code: Alles auswählen
// Tabulatoren, Zeilenumbrüche und überflüssige Leerzeichen aus dem Text entfernen.
$text = preg_replace('/\s+/', ' ', $text);
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 = "nein"; // 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 = "_parent"; // 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);
}
// Tabulatoren, Zeilenumbrüche und überflüssige Leerzeichen aus dem Text entfernen.
$text = preg_replace('/\s+/', ' ', $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 = $link = $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);
$link = preg_replace('/(' . $wort . ')/i', "<mark>$1</mark>", $link);
}
$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" ? ' - ' . $link : '') . '</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 . '">' . $link . '</a><br><small><samp>… ' . $beschreibung . ' …</samp></small><meta http-equiv="refresh" content="50; 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>
TextdateiDu meinst. Kannst Du das mal näher beschrieben oder benennen ...
Code: Alles auswählen
/* Name der Datei in der die Sucheingaben gespeichert werden.
Diese Datei wird beim ersten Eintrag autom. erzeugt! */
$suchdatei = "suchbegriffe.txt"; // suchbegriffe.txt
Ist auch lustig, nur so am Rande. Genau an der Stelle habe ich vor ein paar Tagen noch Veränderungen gemacht. In der Datei werden jetzt auch die IP und wenn möglich der Hostnamen des Suchenden gespeichert. So lässt sich erkennen, ob mehrere verschiedene Suchen vom selben Benutzer ausgeführt wurden.