1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

while produziert Endlosschleife: Warum?

  • osiris
  • 28. März 2008 um 11:09
  • Unerledigt
  • osiris
    8
    osiris
    Mitglied
    Punkte
    695
    Beiträge
    109
    • 28. März 2008 um 11:09
    • #1

    Guten Morgen,

    ich schreibe grade an einem zugegebener Maßen etwas eigenwilligen Passwortgenerator, dessen Kern folgende while-Schleife ist

    PHP
    $pw = NULL;
    $del = NULL;
    
    
    while (strlen($pw) < 8) {
    
    
    	$pwchar = $pw_charset[rand(0, strlen($pw_charset)-1)];
    	echo "Zeichen. ".$pwchar;
    	echo "<br>";
    	$pw = "$pw$pwchar";
    	echo "Passwort bisher: ".$pw;
    	echo "<br>";
    	$pw_charset = preg_replace("/$pwchar/", $del, $pw_charset, 1);
    	echo "Neuer Passwortzeichensatz: ".$pw_charset;
    	echo "<br>";
    	echo "L&auml;nge des Zeichensatzes: ".strlen($pw_charset);
    	echo "<br>";
    }
    Alles anzeigen


    Die Ausgabeanweisungen sind jetzt nur drin, damit ich sehen kann was jeweils passiert.

    Das Problem, dass ich mit diesem Skript habe ist, dass es manchmal eine Endlosschleife produziert. Manchmal aber auch nicht. Ich hab mir schon den Kopf darüber zerbrochen, woran's liegen kann. Finde das Übel aber nicht. Obwohl: Das sitzt ja bekanntlich vorm Monitor. :distur:

    Jedenfalls sieht die Ausgabe bei der Endlosschleife so aus

    Code
    Zufälliger Großbuchstabe: S
    Zufälliger Kleinbuchstabe: n
    Zufällige Zahl: 9
    Zufälliges Sonderzeichen: *
    Zufallskette aus 4 weiteren Zeichen: cv([
    
    
    Passwortzeichensatz: Sn9*cv([
    
    
    Zeichen. n
    Passwort bisher: n
    Neuer Passwortzeichensatz: S9*cv([
    Länge des Zeichensatzes: 7
    Zeichen. 9
    Passwort bisher: n9
    Neuer Passwortzeichensatz: S*cv([
    Länge des Zeichensatzes: 6
    Zeichen. c
    Passwort bisher: n9c
    Neuer Passwortzeichensatz: S*v([
    Länge des Zeichensatzes: 5
    Zeichen. S
    Passwort bisher: n9cS
    Neuer Passwortzeichensatz: *v([
    Länge des Zeichensatzes: 4
    Zeichen. [
    Passwort bisher: n9cS[
    
    
    Warning: preg_replace() [function.preg-replace]: Compilation failed: missing terminating ] for character class at offset 1 in /usr/local/apache_1.3.33/htdocs/siemi/tests/gen_pw.php on line 50
    Neuer Passwortzeichensatz:
    Länge des Zeichensatzes: 0
    Zeichen.
    Passwort bisher: n9cS[
    Neuer Passwortzeichensatz:
    Länge des Zeichensatzes: 0
    Zeichen.
    Passwort bisher: n9cS[
    Neuer Passwortzeichensatz:
    Länge des Zeichensatzes: 0
    ...
    Alles anzeigen

    Das hat ganz offensichtlich was mit preg_replace, also meinem Lieblingsthema (Reguläre Ausdrücke) zu tun.
    Vielleicht sollte ich mal etwas über die Grundlagen der Programmierung lesen... :idea:

  • buechsengustel
    8
    buechsengustel
    Mitglied
    Reaktionen
    1
    Punkte
    626
    Beiträge
    109
    • 28. März 2008 um 11:26
    • #2
    Zitat von osiris

    Jedenfalls sieht die Ausgabe bei der Endlosschleife so aus

    Code
    Warning: preg_replace() [function.preg-replace]: Compilation failed: missing terminating ] for character class at offset 1 in /usr/local/apache_1.3.33/htdocs/siemi/tests/gen_pw.php on line 50

    Mal abgesehen von anderen Problemen: du hast vergessen, regexp-steuerzeichen zu beruecksichtigen. Es kommt ein [ aber kein ] in deinem String vor, peng.

    Was genau willst du ueberhaupt? Ich seh zB gar keinen Grund, hier preg_replace zu verwenden, wenn du doch eh keine regulaeren Ausdruecke verwendest / verwenden willst / verwenden kannst.

    throw away your television

  • Paulchen
    1
    Paulchen
    Gast
    • 28. März 2008 um 11:31
    • #3
    Zitat von osiris
    Code
    ...Warning: preg_replace() [function.preg-replace]: Compilation failed: missing terminating ] for character class at offset 1 in /usr/local/apache_1.3.33/htdocs/siemi/tests/gen_pw.php on line 50
    ...

    "[" hat in regulären Ausdrücken eine spezielle Bedeutung und muss daher, wenn du nicht diese spezielle Bedeutung haben möchtest, sondern genau dieses Zeichen meinst, durch Voranstellen eines "\" escaped werden.

  • osiris
    8
    osiris
    Mitglied
    Punkte
    695
    Beiträge
    109
    • 28. März 2008 um 11:38
    • #4

    Das Problem ist, dass lediglich die Funktion preg_replace die Möglchkeit bietet ein Maximum für die Ersetzungen in einem String festzulegen.

    Ich möchte nämlich immer nur genau ein Zeichen löschen. Das heißt, wenn der Zeichensatz z.B. 4%4mXW5z wäre, sollen nicht auf einmal die beiden "4" gelöscht werden, sondern nur eine von beiden.

    Wenn das nicht nötig wäre, könnte ich das ganze natürlich auch ohne regex realisieren.

    Das Problem liegt also offensichtlich in $pw_charset, weil das die Zeichen -@%/[]()+*?!$ enthalten kann.

    Konnte man die nicht mit einem Backslash "ausklammern"? Das Problem wäre dabei aber wieder, dass das Backslash überall dort, wo ich sonst mit $pw_charset arbeite als einfaches Zeichen interpretiert wird.

  • spinball
    11
    spinball
    Mitglied
    Reaktionen
    67
    Punkte
    1.192
    Beiträge
    223
    • 28. März 2008 um 12:11
    • #5

    Die folgende Funktion fügt dem Passwort-String mittels einer FOR-Schleife genau $len mal ein beliebiges Zeichen aus dem String $charset hinzu und liefert ihn mit return. So hat man volle Kontrolle über alle möglichen Zeichen, aus denen ein Passwort bestehen darf. Reguläre Ausdrücke sind hier fehl am Platz. Mit Regulären Ausdrücken könntest du vielleicht prüfen, ob ein bereits bestehendes Passwort aus einem vorgegebenen Zeichensatz gebildet werden kann, o. ä. Zum Generieren eines neuen Passwortes brauchst du aber keine Regulären Ausdrücke.

    PHP
    function generate_pw($len = 8) {
        $charset = 'abcdefghjkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!§%&/()=?';
    
    
        $pw = "";
        $clen = strlen($charset);
        for($n = 0; $n < $len; $n++) {
            $pw .= $charset[mt_rand(0,$clen - 1)];
        }
    
    
        return $pw;
    }
    Alles anzeigen

    Wir sollten Geld dafür verlangen. :winking_face:

  • osiris
    8
    osiris
    Mitglied
    Punkte
    695
    Beiträge
    109
    • 28. März 2008 um 12:48
    • #6

    Ja, stimmt. Reguläre Ausdrücke braucht man hier nicht.
    Die for-Schleife ist nicht schlecht.
    Aber die löst ein Problem meines komischen Generators nicht ganz (auf das ich hier nicht näher eingehen möchte, weil dann womöglich einigen hier die Haare zu Berge stehen :grinning_squinting_face: ).

    Ich habe jetzt nochmal intensiv php.net usw. gequält und da ein wundersames Werkzeug namens str_shuffle gefunden.
    Damit klappt's!

    Zitat von spinball

    Wir sollten Geld dafür verlangen.


    Keine Angst, ich bekomm auch keins.
    Das ist hier so eine Art Hobby mit Auftrag. :)

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung