Home
Navigation
Impressum
SEO Welten - Webcoding, Editoren, Scripte und Anwendungen
SEO Welten
Buchempfehlungen
 

RegEx: Mit regulären Ausdrücken in Dateien suchen

 Ein kleines Script mit Suchfunktion

Übersicht / Seite:

  1. Reguläre Ausdrücke (kleine Einführung mit Beispielen zur Syntax)
  2. Formulareingaben überprüfen (Eingaben auf Vollständigkeit überprüfen)
  3. Reguläre Ausdrücke mit PHP prüfen (...und RewriteRules testen)
  4. Mit Regex in Dateien suchen (kleines Script mit Suchfunktion)
  5. Im Quelltext/Quellcode suchen (Script zur Suche in Dateien)

Einsatz und Verwendung

Gelegentlich kommt es vor, dass ein Webmaster alle Seiten eines Verzeichnisses, einschließlich aller Seiten in den zu diesem Verzeichnis gehörenden Unterverzeichnissen, nach einem bestimmten Codeabschnitt durchsuchen muss. Diese Aufgabe lässt im Xampp oder innerhalb des eigenen Webspaces auf einem Server mit einem kleinen PHP-Script erledigen, welches auch die Suche mit regulären Ausdrücken unterstützt. Doch Vorsicht, das Script sollte nach der Verwendung auf einem Server unbedingt wieder gelöscht werden, da sich mit diesem auch Passwörter, Schwachstellen im Code usw. ausspioniert werden könnten.

Funktionsweise

Im ersten Schritt wird der gesuchte String oder Codeabschnitt mit Hilfe eines kleinen Formulars an das Script gesendet, wobei eine Extension (Endung) auszuwählen ist, um nur in Dateien mit einem bestimmten Dateiformat zu suchen, wie PHP oder HTML. Der gesuchte String und die Extension werden dabei vom Formular per GET übermittelt und als QueryString an die URL des Scripts angehängt. Um den gesuchten String oder Codeabschnitt innerhalb eines regulären Ausdruckes benutzen zu können, wird im Eingangsbereich die Funktion preg_quote() verwendet, welche alle Zeichen innerhalb des Suchmusters mit einem Backslash maskiert, die in regulären Ausdrücken von Bedeutung sein könnten.

Im mittleren Abschnitt der Suchfunktion werden aus dem Verzeichnis einschließlich der Unterverzeichnisse mit Hilfe einer rekursiven Funktion alle Dateinamen mit der gewählten Extension eingelesen und in einem Array gespeichert. Nachfolgend werden die im Array gespeicherten Dateinamen mit einer Foreach-Schleife einzeln eingelesen, mit fopen() die Dateien geöffnet und mit einer While-Schleife zeilenweise gelesen, wobei gleichzeitig mit der Funktion preg_match() eine Überprüfung erfolgt, ob das gesuchte Muster in der Zeile vorkommt.
Eigentlich könnten nachfolgend die Dateien, in denen das gesuchte Muster vorkam, gleich in einer Liste ausgegeben werden. Da aber in einigen Dateien das gesuchte Muster mehrfach vorkommen könnte und diese Dateien dann doppelt und dreifach aufgelistet würden, erfolgt mit array_count_values() noch eine abschließende Zählung.

Leider hat die Verwendung der Eingangs verwendeten Funktion preg_quote() einen Schönheitsfehler. Sie würde nicht nur mögliche Metazeichen im gesuchten String maskieren, sondern auch reguläre Ausdrücke.

Ein Beispiel, gesucht wird der Meta-Tag charset, der wie folgt eingegeben werden könnte, falls der verwendete Zeichensatz und die Kodierung bekannt sind.

Erstes Beispiel:

<meta charset="windows-1252">

Ist der verwendete Zeichenkodierung hingegen nicht bekannt, könnte dennoch mit Hilfe eines regulären Ausdruckes nach diesem Meta-Tag gesucht werden.

Zweites Beispiel:

<meta charset(.*)>

Da aber im Eingangsbereich die Funktion preg_quote() alle Zeichen im gesuchten String oder im gesuchten Codeabschnitt maskiert, die eine Bedeutung für reguläre Ausdrücke haben könnten, wird das verwendete Muster unbrauchbar.

Drittes Beispiel:

\<meta charset\(\.\*\)\>

Abhilfe schafft hier die Funktion str_replace(), welche das Muster wieder von überzähligen Schrägstrichen befreit. Sollen weitere reguläre Ausdrücke für die Suchfunktion zur Anwendung kommen, müsste die Funktion str_replace() auch für diese Ausdrücke bereinigend eingesetzt werden.

Suche in Dateien
Beispiel einer Suche nach dem Meta-Tag charset.

Das komplette Listing:

<!DOCTYPE html>
<html>

<head>
<title>Suche in Datei</title>
<meta charset="windows-1252">
<meta name="robots" content="noindex,nofollow">
</head>

<body>

<div style="width: 600px; text-align: center; margin: auto">
  <h1>Suche in Datei</h1>
  <form action="<?php echo basename($_SERVER["PHP_SELF"]); ?>" method="get" accept-charset="windows-1252">
    <input name="muster" size="30" type="text"> <select name="endung">
    <option>php</option>
    <option>htm</option>
    <option>html</option>
    <option>txt</option>
    <option>js</option>
    </select>
    <input type="submit" value="Suchen">
  </form>
</div>
<hr style="color: #bcbcbc; background-color: #bcbcbc; border: 0px; height: 1px; margin-top: 22px; margin-bottom: 22px">
<div style="width: 600px; text-align: left; margin: auto">
<?php

if (isset($_GET["endung"]) and !empty($_GET["endung"])){

    $endung = $_GET["endung"];
}
else {$endung = "php";}

if (isset($_GET["muster"]) and !empty($_GET["muster"])){

    $ansicht = $_GET["muster"];
    $muster  = preg_quote($ansicht);

echo "<p>Der Suchbegriff <b>".htmlentities($ansicht, ENT_QUOTES)."</b> wurde<br>gefunden in:</p>\n";

function UmlautINS($umlautINS){

    $sucheuml = array("Ä","ä","Ö","ö","Ü","ü","ß","&Auml;","&auml;","&Ouml;","&ouml;","&Uuml;","&uuml;","&szlig;");
    $ersetzel = array("Ä","ä","Ö","ö","Ü","ü","ß","Ä","ä","Ö","ö","Ü","ü","ß");
    $guteuml  = str_replace($sucheuml,$ersetzel,$umlautINS);

    return $guteuml;
}

function inDATEIEN($pfad){

global $endung;
$meinefiles = array();
$daten = opendir($pfad);

while (false !== ($file = readdir($daten))) {

    $meine = pathinfo($file);

    if (isset($meine["extension"]) and !empty($meine["extension"])) {

    $meine = $meine["extension"];
    }

	if ($file != "." and $file  != ".."){

	    if (is_dir($pfad."/".$file)){

		$alle = inDATEIEN($pfad."/".$file);
		foreach ($alle as $alles){

		$meinefiles[] = $alles;
		}
	     }
	     elseif ($meine == $endung) {

	        $meinefiles[] = $pfad."/".$file;
	    }
        }
}
closedir($daten);
return $meinefiles;
}

$gefunden = inDATEIEN(".");

echo "<ol>\n";

foreach($gefunden as $verwenden){

    if (file_exists($verwenden)){

    $datei = fopen($verwenden."","r") or die ("Fehler bei fopen!\n");

	while(!feof($datei)) {$zeile = fgets($datei, 1024);

	$zeile = UmlautINS($zeile);

	$muster = str_replace("\(\.\*\)", "(.*)", $muster);

	     if (preg_match("~".$muster."~i", $zeile)){

	     $benutzen[] = $verwenden;
	     }
        }
    } else {echo "Wo liegt File?\n";
    }
}
if (isset($benutzen)) {

    $inhaltvon = count($benutzen);

    if ($inhaltvon > 0){

	$benutzen = array_count_values($benutzen);

	foreach($benutzen as $ausgeben => $treffer){

	echo "<li>Insgesamt <b>".$treffer."</b> Treffer in ".$ausgeben."</li>\n";
	}

     echo "</ol>\n";
     }
else {echo "Es wurde nichts gefunden!\n";}
}}
else {echo "Es wurde noch kein Suchbegriff übermittelt!\n";}
?>

</div>
</body>
</html>

Wichtiger Hinweis: Wie bereits weiter oben erwähnt, wer dieses Script innerhalb seines Webspaces verwendet, sollte es unbedingt nach Gebrauch wieder löschen, da die Suchfunktion kaum Sicherheit vor der Einschleusung von Schadcode und keine Sicherheit vor dem Ausspähen von Daten bietet. Weiterhin sollte das Script bei umfangreichen Projekten nie im Hauptverzeichnis abgelegt werden, um nicht Verzeichnisse mit wesentlich mehr als 100 bis 200 Seiten (Anzahl abhängig von der Dateigröße) durchsuchen zu müssen. Die Erprobung und Verwendung des Scripts erfolgt auf eigenes Risiko.


Ein um einige Funktionen erweitertes Script finden sie auf der nächsten Seite.

Formulareingaben | mit PHP prüfen « Reguläre Ausdrücke » erweitertes Script

 
Navigation

Finden und
gefunden werden ...


- Optimierung -

 

Webcoding

Übersicht


Web Services


Tutorials &
diverse Listings

und vieles mehr...


XML


Copyright © 2006 - Verlag Horst Müller - Stendal | Datenschutz | Nutzungsbedingungen