while produziert Endlosschleife: Warum?

  • Guten Morgen,

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


    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

    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:

  • 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

  • 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.

  • 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.

  • 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.

    Wir sollten Geld dafür verlangen. ;)

  • 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 :D ).

    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. :)

Jetzt mitmachen!

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