Bekomm regex nicht hin

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Bekomm regex nicht hin

    Hallo zusammen,

    auf folgenden String möchte ich matchen

    a/b/c/d/e

    dabei möchte ich das ergebnis

    a/b
    c
    d
    e

    Dieses Pattern hab ich bisher: ([^/]*\/[^/]*)\/?([^\/]*)\/?

    Das funktioniert aber nicht Ich bekomm zwar a/b und c, der rest wird aber weggeschnitten. Wichtig ist noch, dass c/d/e optional ist, d.h. wenn nur a/b dasteht, muss das Ding nur auf a/b matchen können.

    DANKE!!

  • #2
    #([a-z]/[a-z])(/([a-z])){0,3}#

    Nach Bedarf selbst * setzen.

    Kommentar


    • #3
      Hab jetzt das hier: |([a-z]*/[a-z]*)(/([a-z]*)){0,3}|

      /container/show/sdsdfsdf/werwer

      bringt:
      PHP-Code:
      Array
      (
          [
      0] => Array
              (
                  [
      0] => container/show/sdsdfsdf/werwer
              
      )

          [
      1] => Array
              (
                  [
      0] => container/show
              
      )

          [
      2] => Array
              (
                  [
      0] => /werwer
              
      )

          [
      3] => Array
              (
                  [
      0] => werwer
              
      )

      )
      Array
      (
          [
      0] => Array
              (
                  [
      0] => container/show/sdsdfsdf/werwer
              
      )

          [
      1] => Array
              (
                  [
      0] => container/show
              
      )

          [
      2] => Array
              (
                  [
      0] => /werwer
              
      )

          [
      3] => Array
              (
                  [
      0] => werwer
              
      )


      Noch nicht so ganz :-)

      Kommentar


      • #4
        Ungreedy!

        Kommentar


        • #5
          Hm, hab so ziemlich alle Varianten durch, passt aber irgendwie nciht...

          Bei dem hier hätte ich erwartet, dass das ungreedy richtig ist:

          |([a-z]*?/[a-z]*?)(/([a-z]*)){0,3}|

          Da wird aber so gematcht:

          a/
          b/
          c/

          und d fehlt ganz...

          |([a-z]*/[a-z]*)(/([a-z]*?)){0,3}|

          Bei dem passt zwar
          a/b
          aber c/d steht auch zusammen...

          Kommentar


          • #6
            was spricht eigentlich gegen explode()?

            Kommentar


            • #7
              Ich brauche das erste vorkommen a/b eben zusammengesetzt. Und da wollte ich mir die ganzen String-Operationen sparen. Erst explode, dann wieder die ersten beiden zusammensetzen etc. Ist nur ne Frage wg. der Performance. Falls explode schneller ist, nehm ich auch gerne das...

              Kommentar


              • #8
                Dann probiers doch mal aus.
                ICH BIN ICH!!!

                Kommentar


                • #9
                  Hm, ich weiß nicht genau, wie ich das testen kann. Meine Anwendung hat auf localhost eine Ausführungszeit von 0,01 - 0,008 sek. Ausführungszeit. Das regex brauche ich für einen URL-Mapper. Das ganze soll auch richtig schnell sein, sehr viele Anfragen gleichzeitig kommen...

                  Kommentar


                  • #10
                    mit einer hinreichend großen schleife vielleicht?

                    Kommentar


                    • #11
                      Ok, dann werd ich das mal testen. Dafür brauch ich aber nach wie vor das richtige Regex :-)

                      Kommentar


                      • #12
                        $regex='#(^(?:[^/\s]+/[^/\s]+)|(?:/[^/\s]+))#';
                        Slava
                        bituniverse.com

                        Kommentar


                        • #13
                          Super, danke! Sieht schon sehr gut aus!

                          http://regexp-evaluator.de/evaluator...cca8/#ergebnis

                          Nur der "/" am Anfang von param1, param2 usw. muss noch weg :-) Dann ist es perfekt!

                          Kommentar


                          • #14
                            1) ltrim ist eine gute funktion.
                            2)regex muss besser so aussehen
                            ((?:^[^/\s]+/[^/\s]+)|(?:/[^/\s]+))
                            3) explode und stringfunktionen sind für diese aufgabe doch besser geeignet
                            Slava
                            bituniverse.com

                            Kommentar

                            Lädt...
                            X