string suchen und ersetzen zeile nach zeile

G

gaylord06

Hallo Leute,

da ich gerade erst angefangen habe php zu lernen, aber ein kleines script jetzt schon dringend bräuchte, poste ich hier mein Problem.

Ich habe eine Textdatei die folgendermaßen aussieht:

e-Mail:hash
...
..

...das ist die erste textdatei. dann habe ich noch eine textdatei in dem format:

hash: plaintext (ohne leerzeichen zwischen..hier kommt aber der doofe smilie :p)
...
..

Die hashes in der 2 textdatei sind wirr durcheinander. Nun möchte ich gerne ein script haben, dass das die erste zeile nimmt aus der 2 textdatei und nach dem hash sucht in der ersten...und ihn dann durch den plaintext ersetzt. dannach soll natürlich mit der 2 zeile weiter gemacht werden usw.

es müsste glaube ich eignetlich alles machbar sein mit folgenden befehlen
file(); str_replace(); preg_match_all(); fopen(),
jedoch komme ich damit nicht wirklich klar!


puh hoffentlich nicht zu kompliziert ausgedrückt ^^ .....
Ich hoffe jemand kann mir helfen.

mfg gaylord06
 
Zuletzt bearbeitet von einem Moderator:
Wenn es nicht ganz so auf die Ordnung der Mailadressen ankommt, wie sie in Datei #1 angegeben sind, empfiehlt sich eine Lösung, wie diese:
PHP:
<?php
// Array mit allen Daten - Wird folgenden Aufbau haben:
// $final['hash'] = array( 'email' => "", 'plain' => "" );
$final = array();

// Öffne Filestream, wenn möglich
if ( $fh = fopen( $filePath1, 'r' ) ) {
    // Durchlaufe Zeile für Zeile
    while( $current = fgets( $fh, 4096 ) ) {
        // $email bekommt Inhalte vor dem ersten ':', $hash alles danach
        list( $email, $hash ) = explode( ':', $current, 1 );
        // Erzeuge Feld in $final mit assoziativem Index $hash
        $final[$hash] = array(
                'email' => $email,
                'plain' => ""
            );
    }
    fclose( $fh );
}

// Wenn $final nicht leer ist, prüfe auf Zuordnungen
if ( !empty( $final ) && $fh = fopen( $filePath2, 'r' ) ) {
    // Durchlaufe Zeile für Zeile
    while( $current = fgets( $fh, 4096 ) ) {
        // $hash bekommt Inhalte vor dem ersten ':', $plaintext alles danach
        list( $hash, $plaintext ) = explode( ':', $current, 1 );
        // ordne Plaintext zu, wenn möglich
        if ( isset( $final[$hash] ) )
            $final[$hash]['plain'] = $plaintext;
    }
    fclose( $fh );
}

// Testausgabe
foreach ( $final as $hash => &$array ) {
    echo "{$array['email']}: {$array['plaintext']} ({$hash})\n";
}

Ansonsten wäre es sinnvoll, ein Array à la $array[numIndex] = array( 'email' => ..., 'hash' => ..., 'plain' => ...) anzulegen, wobei dann jedoch eine Prüfschleife erforderlich wäre, welcher Index denn nun den entsprechenden Hashwert hält. Wenn der Hashwert gar nicht existiert, läuft die Schleife sogar umsonst durch.

Ist eine Datenbanklösung ausgeschlossen? In einem solchen Falle ginge das ganze wesentlich komfortabler und effizienter ;)
 
Darf man erfahren um welche Klartextdaten es sich handelt? Ich hoffe mal es ist kein Kennwort oder etwas Ähnliches.
 

Neue Beiträge

Zurück