Stefan Kleeschulte: Variable in Regulärem Ausdruck

Hi zusammen!

Ich habe folgendes Problem: Ich möchte mit Hilfe eines Regulären Ausdrucks einen Benutzernamen auf richtigkeit Prüfen. In einer Konfigurations-Datei ist unter anderem festgelegt, wie lang der Benutzername mindestens sein muss und höchstens sein darf (in Variablen gespeichert).

Wie kann ich nun im Regulären Ausdruck auf diese Variablen zurückgreifen?

Zur verdeutlichung was ich bräuchte, was aber nicht klappt:
/^\b[\w-.]{$nickname_minlength,$nickname_maxlength}\b$/

Weiß einer von euch ob/wie das geht?
CU :-)
Stefan

  1. Hallo Stefan,

    Wie kann ich nun im Regulären Ausdruck auf diese Variablen zurückgreifen?

    Zur verdeutlichung was ich bräuchte, was aber nicht klappt:
    /^\b[\w-.]{$nickname_minlength,$nickname_maxlength}\b$/

    Hmmm, folgendes geht:
    %>perl -we "$min = 1; $max = 3; $_ = 'abbcccddddeeeee'; print $1 while /((\w)\2{$min,$max})/g;"
    und ergibt:
    %> bbcccddddeeee

    Vermutlich liegt der Fehler eher im \b das vielleicht nicht dort trifft, wo Du es erwartest, wenn Du eine Klasse angibst, in der auch nichtalphanumerische Zeichen vorkommen. \b trifft nämlich nur zwischen \w und \W aber nicht zwischen . und \W und auch nicht zwischen - und \W. Also kann Dein Ausdruck nicht treffen, falls der String mit \W beginnt oder aufhört. Da Du am Anfang und Ende verankerst, kannst Du Dir \b vielleicht sogar ganz sparen. Poste doch mal den Text, auf den Du den regulären Ausdruck loslässt ohne zu treffen, und den String den Du erwartest zu finden.

    Gruß Alex

    1. Hallo Stefan,

      Wie kann ich nun im Regulären Ausdruck auf diese Variablen zurückgreifen?

      Zur verdeutlichung was ich bräuchte, was aber nicht klappt:
      /^\b[\w-.]{$nickname_minlength,$nickname_maxlength}\b$/

      Hmmm, folgendes geht:
      %>perl -we "$min = 1; $max = 3; $_ = 'abbcccddddeeeee'; print $1 while /((\w)\2{$min,$max})/g;"
      und ergibt:
      %> bbcccddddeeee

      Vermutlich liegt der Fehler eher im \b das vielleicht nicht dort trifft, wo Du es erwartest, wenn Du eine Klasse angibst, in der auch nichtalphanumerische Zeichen vorkommen. \b trifft nämlich nur zwischen \w und \W aber nicht zwischen . und \W und auch nicht zwischen - und \W. Also kann Dein Ausdruck nicht treffen, falls der String mit \W beginnt oder aufhört. Da Du am Anfang und Ende verankerst, kannst Du Dir \b vielleicht sogar ganz sparen. Poste doch mal den Text, auf den Du den regulären Ausdruck loslässt ohne zu treffen, und den String den Du erwartest zu finden.

      Wenn ich die beiden Variablen durch Zahlen ersetze klappt es. (Z. B. mit "abcabc", "abc_abc" oder "abc.-ABC").

      Ich fürchte eher es liegt an PHP, mit Perl klappts. (Hab's gerade ausporbiert...)

      Hast du noch 'ne Idee?
      CU :-)
      Stefan

      1. Habe die Lösung, hätte ja auch selber drauf kommen können...

        preg_match ("/^\b[\w-.]{".$nickname_minlength.",".$nickname_maxlength."}\b$/", $nickname)

        Trotzdem Danke!

        CU :-)
        Stefan

        1. Habe die Lösung, hätte ja auch selber drauf kommen können...

          preg_match ("/^\b[\w-.]{".$nickname_minlength.",".$nickname_maxlength."}\b$/", $nickname)

          Trotzdem Danke!

          Grummel, ich glaub ich bin zu müde, diese "Lösung" funktioniert nicht, ich hab' beim ausprobieren was falsch gemacht...

          Ich geh schlafen und frag morgen nochmal nach...

          CU <gähn> (-:
          Stefan

          1. Joho,

            preg_match ("/^\b[\w-.]{".$nickname_minlength.",".$nickname_maxlength."}\b$/", $nickname)

            Grummel, ich glaub ich bin zu müde, diese "Lösung" funktioniert nicht, ich hab' beim
            ausprobieren was falsch gemacht...

            Wozu hast du die \b da stehen? Das heisst, dass die Strings jeweils mit einem \W enden
            muessen, also z. B. - oder .

            Lass die \b weg, und dein RegEx sollte korrekt matchen.

            Gruss,
             CK