<?php
/*
 Kleine Suchmaschine - Version vom: 20.11.2013 - Webbausteine.de
 Diese Suchmaschine durchsucht die angegebenen Verzeichnisse
 und die darin enthaltenen Dateien nach einem Suchbegriff!
*/

/* Die zu durchsuchenden Verzeichnisse eintragen.
 Aktuelles Verzeichnis durchsuchen mit  "./"   */
$verzeichnisse = array(
"./",
"./Tutorial/",
"../",
"../Kommentare/",
"../Kommentare/Tutorial-Kommentar-Skript/",
"../MLR-Schrift-Tab/",
"../MLR-Schrift-Tab/Tutorial/",
"../Nachrichten/",
"../Nachrichten/Tutorial/",

);

/* Die Dateiendungen der Dateien die gefunden werden sollen.
Dateiendungen mit Großbuchstaben müssen extra eingetragen werden! */
$dateiendungen = array(
".gif",
".htm",
".html",
".jpg",
".mp3",
".pdf",
".php",
".png",
".txt",
".zip",
);

/* Die Dateiendungen der Dateien die von der oberen Liste "keine"
 Textdateien sind (es wird nur der Dateiname angezeigt) */
$_dateiendungen = array(
".gif",
".jpg",
".mp3",
".pdf",
".png",
".zip",
);

/* Vorzeichen bei Dateien die nicht durchsucht werden
 sollen zum Beispiel: _intern.htm,  _log.php,  _data.txt */
$vorzeichen = "_";

/* Einzelne Dateien die nicht durchsucht werden sollen */
$nicht_durchsuchen = array(
"nachrichten.php",
"nachrichten_editor.php",

);

/* Länge des minimalen Suchbegriffs (hier min. 3 Zeichen) */
$suchbegriff_min = 3;

/* Länge des maximalen Suchbegriffs */
$suchbegriff_max = 50;

/* Datei-Info - Anzahl der durchsuchten Verzeichnisse und Dateien anzeigen (ja/nein) */
$datei_info = "ja";

/* Maximale Anzeige (Begrenzung) der Suchergebnisse */
$suchergebnisse_max = 400;

/* Ergebnis der Suche speichern (ja/nein) */
$speichern = "nein";

/* Name der Datei in der die Sucheingaben gespeichert werden */
$suchdatei = "suchbegriffe.txt"; // Benötigt Schreibrechte!

/* Automatische Weiterleitung wenn nur eine Datei gefunden wurde (ja/nein) */
$autolink = "nein";

/* Unerwünschte Sucheingaben von der Suche ausschließen */
$ausschluss = array(
"Demotext",
"Demotext2",
);

/* Länge des angezeigten Textausschnitts (Zeichen) */
$textausschnitt = 200;

/* META-Tags, wenn diese vorhanden sind, anzeigen (ja/nein) */
$metatags = "nein";

/* URL (Optional) Bsp.: www.example.com/ */
$url = "";

/*  Zeitzone (siehe: http://de3.php.net/manual/de/timezones.europe.php) */
date_default_timezone_set("Europe/Berlin");

// Formular anzeigen
echo '<form method="get" action="' . $_SERVER["SCRIPT_NAME"] . '"> <input type="search" name="suchbegriff" placeholder="Suchbegriff eingeben (3-50 Zeichen)" value="' . (isset($_GET["suchbegriff"]) ? strip_tags($_GET["suchbegriff"]) : '') . '" size="35" maxlength="' . $suchbegriff_max . '" required="required"> <input type="submit" name="suche" value="suchen"></form>';

$gefunden = $dateinr = 0; $link = ""; $ausgabe = array();
$startzeit = microtime(true);

if (isset($_GET["suche"]) || isset($_GET["suchbegriff"])) {
 $_GET["suchbegriff"] = strip_tags(trim($_GET["suchbegriff"]));
 $_GET["suchbegriff"] = str_ireplace($ausschluss, "", $_GET["suchbegriff"]);
 if (strlen($_GET["suchbegriff"]) >= $suchbegriff_min && strlen($_GET["suchbegriff"]) <= $suchbegriff_max) {
  foreach ($verzeichnisse as $verzeichnis) {
   foreach ($dateiendungen as $dateiendung) {
    foreach (glob($verzeichnis . "*" . $dateiendung) as $datei) {
     $dateiname = basename($datei);
     if ($dateiname[0] != $vorzeichen &&
         !in_array($dateiname, $nicht_durchsuchen)) {
      $text = (!in_array($dateiendung, $_dateiendungen)) ? file_get_contents($datei) : substr(strtoupper($dateiendung), 1) . '-Datei';
      preg_match('/<title>(.*?)<\/title>/i', $text, $t);
      $titel = isset($t[1]) ? $t[1] : $dateiname;
      unset($t[1]);
      $dateinr++;
      $meta = ($metatags == "ja" && count(get_meta_tags($datei)) > 0) ? '<br>' . implode('<br>', get_meta_tags($datei)) : "";
      $text = preg_replace('/\<head\>(.*)\<\/head\>/Usi', '', $text);
      $text = strtr(strip_tags($text), array("&auml;"=>"ä", "&ouml;"=>"ö", "&uuml;"=>"ü", "&Auml;"=>"Ä", "&Ouml;"=>"Ö", "&Uuml;"=>"Ü", "&szlig;"=>"ß", "\r" =>" ", "\n" =>" ", "\t" =>" ", "  " =>" "));
     
      $preg = explode(" ", $_GET["suchbegriff"]);
      $preg = implode(".*?", $preg);
      if ((strstr($text, $_GET["suchbegriff"]) or
           stristr($text, $_GET["suchbegriff"]) or
           stristr($dateiname, $_GET["suchbegriff"]) or
           preg_match("/" . $preg . "/i", $text)) &&
           $gefunden <= $suchergebnisse_max) {
       $gefunden++;
       $link = $datei;
       $start = strpos(strtolower($text), strtolower($_GET["suchbegriff"])) - $textausschnitt;
       if ($start < 0) $start = 0;
       $ende = strlen($_GET["suchbegriff"]) + $textausschnitt *2;
       $textteil = substr($text, $start, $ende);
       $treffer = substr_count(strtolower($text), strtolower($_GET["suchbegriff"]));
       $ausgabe[$treffer . $gefunden] = '<li><a href="' . $datei . '">' . $titel . '</a> <small>(' . $treffer . 'x)</small>' . $meta . '<br>&hellip; ' .
        preg_replace('/(' . $_GET["suchbegriff"] . ')/i', "<mark>\$1</mark>", (strlen($textteil) < $textausschnitt ? substr($text, strpos($text, $_GET["suchbegriff"]), $textausschnitt) : $textteil)) .
        ' &hellip;<br><var>Stand: ' . date("d.m.y h:i", filemtime($datei)) . ' - ' . number_format((filesize($datei) / 1024), 1, ",", ".") . ' KB - ' . $url . $datei . '</var></li>';
      }
     }
    }
   }
  }
  krsort($ausgabe);
  $ausgabe = implode($ausgabe);

  // Keine Übereinstimmungen gefunden
  if ($gefunden == 0) {
   echo '<p>Es wurden keine Übereinstimmungen mit dem eingegebenen Suchbegriff gefunden.</p>';
  }
  else {
   // Automatische Weiterleitung
   if ($autolink == "ja" && $gefunden == 1) {
    echo '<script>location.href="' . $link . '";</script><noscript><meta http-equiv="refresh" content="0; URL=' . $link . '"></noscript>';
   }
   // Ausgabe
   echo '<p>Es ' . ($gefunden == 1 ? 'wurde '. $gefunden . ' Datei' : 'wurden ' . $gefunden . ' Dateien') . ' gefunden:</p>' .
   '<ol>' . $ausgabe . '</ol>';
  }
  // Datei-Info anzeigen
  if ($datei_info == "ja") {
   printf('<p>Durchsuchte Verzeichnisse: ' . count($verzeichnisse) . ' - Dateien: ' . $dateinr . ' (in %.2f Sekunden)</p>', microtime(true) - $startzeit);
  }
  // Ergebnis der Suche speichern
  if ($speichern == "ja") {
   $fp = fopen($suchdatei, "a+");
   fputs($fp, date("d.m.y H:i") . '|' . $_GET["suchbegriff"] .  '|' . $gefunden . "\n");
   fclose($fp);
  }
 }
 // Länge des Suchbegriffs zu kurz/zu lang
 else {
  echo '<p>Es sind ' . (strlen($_GET["suchbegriff"]) < $suchbegriff_min ?
   'mindestens ' . $suchbegriff_min . ' Zeichen nötig' :
   'maximal ' . $suchbegriff_max . ' Zeichen erlaubt') . '!</p>';
 }
}
?>