Lilly: PHP Regex für Ordner

Hallo Ihr Lieben,

ich versuche mich an einem regulären Ausdruck komme aber nicht zu dem Ergebnis welches ich mir vorstelle.

Ich möchte über die Regex einen Ordnerpfad (Linux) prüfen lassen.

Der Ordner soll bestehen dürfen aus:

  • Zahlen
  • Buchstaben (nur Kleinschreibung)
  • / (Nur einfach, also keine doppelten //)
  • Bindestriche - (aber nur wenn davor oder dahinter min. ein Buchstabe o. eine Zahl steht)
  • Sollte insgesamt max. 75 Zeichen haben
  • Sollte mindestens 5 Zeichen haben also für start/
  • und muss mit dem prefix start/ beginnen! (Also start ist immer der erste Ordner)

Also so:

  • start/some-folder-name (OK)

  • start/123some-folder-name (OK)

  • start/some-folder-name/extrafolder (OK)

  • xxx/some-folder-name (Verboten, weil falsches prefix)

  • start/-some-folder-name (Verboten, weil Bindestrich am Anfang)

  • start/some-folder-name- (Verboten, weil Bindestrich am Ende)

  • start/../somefolder (Verboten weil Punkte verwendet wurden)

Mein Versuch:

/[1]{5,75}$/

Hier ist aber das Problem das mir der Prefix "start/" fehlt, dass doppelte // möglich sind und das die Bindestriche auch ohne Buchstaben verwendet werden dürfen.

Vllt. kann mir da jemand von euch weiterhelfen?

Liebe Grüße!


  1. a-z0-9-/ ↩︎

  1. Hi,

    Ich möchte über die Regex einen Ordnerpfad (Linux) prüfen lassen.

    warum mit einem Regex?

    Der Ordner soll bestehen dürfen aus:

    • Sollte mindestens 5 Zeichen haben also für start/
    • und muss mit dem prefix start/ beginnen! (Also start ist immer der erste Ordner)

    5 Zeichen sind aber zu wenig, wenn's mit start/ anfangen soll, weil das schon 6 Zeichen sind.

    /[1]{5,75}$/

    wenn's mit start anfangen soll:

    ~^start/[a-z0-9/-]{0,69}$~

    Wenn / im Regex vorkommt, nimm ein anderes Zeichen als Delimiter, ich benutz gerne die Tilde. Wenn - in den [] als erstes oder letztes vorkommt, braucht's nicht escaped zu werden.

    Damit hast Du geprüft: Länge, Anfang, Zeichenvorrat. Fehlt noch: -/ und /- darf nicht vorkommen.

    Das würd ich als 2 Extra-Prüfungen danach abprüfen, einfach gucken, ob -/ oder /- im String vorkommt, das braucht noch nichtmal einen Regex.

    cu,
    Andreas a/k/a MudGuard


    1. a-z0-9-/ ↩︎

    1. Hallo,

      5 Zeichen sind aber zu wenig, wenn's mit start/ anfangen soll, weil das schon 6 Zeichen sind.

      Ja richtig ich hab den Slash vergessen.

      Das würd ich als 2 Extra-Prüfungen danach abprüfen, einfach gucken, ob -/ oder /- im String vorkommt, das braucht noch nichtmal einen Regex.

      Ich hab dazu jetzt noch einen Filter angelegt der mit die HyphenSlash entfernt, also ala:

      preg_replace('~(-/+|/-+)~', '/', $string);

      Das funktioniert ganz gut.

      Das man anstatt / auch ~ verwenden kann wusste ich nicht, danke für den Tipp das macht es etwas übersichtlicher :)

      Danke für deine Hilfe die regulären Ausdrücke funktionieren jetzt :)

      Liebe Grüße!

    2. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

      5 Zeichen sind aber zu wenig, wenn's mit start/ anfangen soll, weil das schon 6 Zeichen sind.

      /[1]{5,75}$/

      wenn's mit start anfangen soll:

      ~^start/[a-z0-9/-]{0,69}$~

      Wenn / im Regex vorkommt, nimm ein anderes Zeichen als Delimiter, ich benutz gerne die Tilde. Wenn - in den [] als erstes oder letztes vorkommt, braucht's nicht escaped zu werden.

      Damit hast Du geprüft: Länge, Anfang, Zeichenvorrat. Fehlt noch: -/ und /- darf nicht vorkommen.

      Das würd ich als 2 Extra-Prüfungen danach abprüfen, einfach gucken, ob -/ oder /- im String vorkommt, das braucht noch nichtmal einen Regex.

      fehlt noch der Doppel-Slash, der verboten ist

      Spirituelle Grüße
      Euer Robert
      robert.r@online.de

      --
      Möge der wahre Forumsgeist ewig leben!

      1. a-z0-9-/ ↩︎

      1. Hallo,

        fehlt noch der Doppel-Slash, der verboten ist

        Ja richtig, der wird hier nicht berücksichtigt, danke für den Hinweis.

        Kann man festlegen das ein Zeichen auf sich selbst nur einmal folgen darf? Das wäre ja auch für den Bindestrich noch sehr interessant, also als Beispiel:

        start/folder--name (Verboten) start/folder//name (Verboten)

        start/folder-extra-name (OK) start/folder/extra/name (OK)

        Liebe Grüße!

        1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

          fehlt noch der Doppel-Slash, der verboten ist

          Ja richtig, der wird hier nicht berücksichtigt, danke für den Hinweis.

          Kann man festlegen das ein Zeichen auf sich selbst nur einmal folgen darf? Das wäre ja auch für den Bindestrich noch sehr interessant, also als Beispiel:

          
          > start/folder--name (Verboten)  
          
          
          > start/folder//name (Verboten)  
          > 
          > start/folder-extra-name (OK)  
          
          
          > start/folder/extra/name (OK)
          
          

          Die Zeichenfolgen, die verboten sind, würde ich einfach mit einem str_replace() in PHP klären. Entweder gegen '' austauschen und dann anhand der Verkürzung des Strings Du-Du machen, oder auch korrigieren, soweit das möglich und erwünscht ist.

          Das ist nämlich viel übrsichtlicher, als eine RegExp.

          Und anschließend dann erst die RegExp für die Dinge, die vorgeschrieben und erlaubt sind benutzen.

          Spirituelle Grüße
          Euer Robert
          robert.r@online.de

          --
          Möge der wahre Forumsgeist ewig leben!
  2. Liebe Lilly,

    /[1]{5,75}$/

    da erlaubst Du den Slash als Bestandteil des bis zu 75 Zeichen langen Datei-/Verzeichnisnamen. Das ist nicht das, was Du willst.

    Lass mich mal etwas versuchen (ungetestet!):

    ~^start(/[a-z0-9][a-z0-9-]{3, 73}[a-z0-9])+$~

    Der Ausdruck verlangt als erste fünf Zeichen "start". Dann kommt mindestens ein Verzeichnisname (der Inhalt der runden Klammern, also z.B. "start/verzeichnis1") mit dem erlaubten Set an Zeichen, wobei das erste und letzte Zeichen zwingend Kleinbuchstabe oder Ziffer ist. Das Pluszeichen nach der runden Klammer bedeutet "mindestens ein Vorkommen". Damit sollten auch beliebig tief verschachtelte Unterverzeichnisse mit erkannt werden, wie z.B. "start/verzeichnis1/unter-verz-1". Natürlich endet der Ausdruck mit dem Dollarzeichen, das sicherstellt, dass nach dem/den Vorkommen keine weiteren Zeichen mehr folgen.

    Liebe Grüße,

    Felix Riesterer.


    1. a-z0-9-/ ↩︎

    1. @@Felix Riesterer

      ~^start(/[a-z0-9][a-z0-9-]{3, 73}[a-z0-9])+$~

      „Sollte insgesamt max. 75 Zeichen haben“ wird damit nicht geprüft.

      Und wieso sollten zwischen /[a-z0-9] und [a-z0-9] mindestens 3 Zeichen sein? Damit wäre /abba ausgeschlossen.

      Nicht nur, dass da nichts dazwischen stehen muss; wenn nichts dazwischen steht, muss auch das schließende [a-z0-9] nicht da sein, um /a/abba zu erlauben.

      Dann werf ich mal in die Runde:
      ~^start(/[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$~

      Bzw. mit (?: statt ( – es soll ja nur geklammert, nicht gemerkt werden.
      ~^start(?:/[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+$~

      Allerdings wird damit immer noch nicht die Gesamtlänge geprüft. Aber warum sollte man das wollen?

      LLAP

      --
      „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

        Nicht nur, dass da nichts dazwischen stehen muss; wenn nichts dazwischen steht, muss auch das schließende [a-z0-9] nicht da sein, um /a/abba zu erlauben.

        Dann werf ich mal in die Runde:
        ~^start(/[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$~

        Bzw. mit (?: statt ( – es soll ja nur geklammert, nicht gemerkt werden.
        ~^start(?:/[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+$~

        An der Stelle

        [a-z0-9-]*
        

        sehe ich aber noch, dass der Bindestrich sooft hintereinander kommen darf, wie er will. Oder irre ich mich da?

        Spirituelle Grüße
        Euer Robert
        robert.r@online.de

        --
        Möge der wahre Forumsgeist ewig leben!
        1. @@robertroth

          sehe ich aber noch, dass der Bindestrich sooft hintereinander kommen darf, wie er will. Oder irre ich mich da?

          Nein, tust du nicht. Ich war schon am Tippen.

          LLAP

          --
          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      2. @@Gunnar Bittersmann

        Dann werf ich mal in die Runde:
        ~^start(/[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$~

        Nee, auch das ist es noch nicht; -- soll ja auch ausgeschlossen sein.

        Also nicht [a-z0-9-]*, sondern nochmals gruppieren, die Gruppe mehrmal vorkommen dürfen lassen:
        ~^start(/[a-z0-9]+(-[a-z0-9]+)*)+$~

        Bzw. ~^start(?:/[a-z0-9]+(?:-[a-z0-9]+)*)+$~

        LLAP

        --
        „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)