preg_mach....muster

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

  • preg_mach....muster

    Hallo!
    Kann mir jemand sagen, was genau
    "/\/\/[^\/]*(.*)/"
    bedeutet, nach welchem muster hier gesucht wird:
    preg_match( "/\/\/[^\/]*(.*)/", $_CONF['site_url'], $pathonly );

    und hier?
    "/\/\/[^\/]*)/"?

    DANKE ; Julia

  • #2
    ich poste mal, damit dein thema wieder nach oben kommt so ganz ohne antwort is ja auch blöd und ich weiß, dass es einige wissen.

    ich bin kein experte darin, aber so halbwegs kann ich dir viellleicht weiterhelfen.

    "/\/\/[^\/]*"

    würde dir den teil einer Zeichenkette liefern, der mit // beginnt und anschliessend beliebige Zeichen ausser dem / hat.
    also bei "http://www.google.de/search.html" würde "//www.google.de" den Teil erfüllen

    das (.*) steht für ein Teilmuster in dem jedes beliebige Zeichen, egal wie oft vorkommen kann.

    die Kombination aus beiden, muss dir jetzt ein Profi erklären. ich weiß zwar was rauskommt, aber auch nur, weil ich's probiert habe
    Zuletzt geändert von graf; 02.07.2003, 13:42.

    Kommentar


    • #3
      Das erst und letzte / könnte auch als trenner für die Optionen stehen, dann dürfte der Slash eigentlich aber nicht im Ausdruck vorkommen, es sei denn wie hier, das er durch einen Backslash verwandelt wird. Sonst macht nämlich der erste Slash keinen Sinn, da die weiteren ja umgewandelt werden.

      Also für mich liest sich das auch so wie von graf beschrieben:

      // gefolgt von beliebig vielen Zeichen außer / gefolgt von beliebig vielen Zeichen

      Da der letzte Teil in in Klammern steht, kann ich diesen per Variable abgreifen, in diesem Fall $pathonly[1].
      Bei dem Beispiel "http://www.google.de/search" würde der Ausdruck folgendes erfassen:
      //www.google.de/search
      Dies entspricht $pathonly[0]. Die Variable $pathonly[1] würde dann entsprechend nur "/search" enthalten.

      Grüße, Andi

      Kommentar


      • #4
        Original geschrieben von andik2000
        Das erst und letzte / könnte auch als trenner für die Optionen stehen, dann dürfte der Slash eigentlich aber nicht im Ausdruck vorkommen, es sei denn wie hier, das er durch einen Backslash verwandelt wird.
        gut erkannt :-)

        der slash _ist_ in diesem falle der sogenannte delimiter.

        allerdings würde es sich wohl anbieten, hier einen anderen delimiter wie z.b. ! zu wählen (da dieses im ausdruck selbst nicht vorkommt) - so müsste man die slashes innerhalb des ausdruckes nicht noch zusätzlich maskieren ...
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Original geschrieben von wahsaga
          gut erkannt :-)
          Danke man lernt ja immer dazu.

          Kommentar


          • #6
            kann MIR jetzt noch einmal einer erklären, warum ich nun in
            $pathonly[0] alles drin habe (ab // inkl.) und in $pathonly[1], nur das, was von
            "/\/\/[^\/]*" nicht erfasst wird?

            mit den regulären ausdrücken habe ich so meine verständnisschwierigkeiten, gerade was diese delimiter angeht, und die Teilmuster-Klammerung.

            Kommentar


            • #7
              Hmm, ich versteh diesen RegEx nicht so ganz.
              Wenn / der Delimiter ist, warum steht der dann nur am Anfang?

              Das, was er macht ist glaub ich richtig beschrieben, vorausgesetzt, er macht übrehaupt was.

              Ein gutest Tutorial über Reguläre Ausdrücke gibt es hier: http://www.php-resource.de/tutorials/read/10/1/
              hopka.net!

              Kommentar


              • #8
                Original geschrieben von Hopka
                Wenn / der Delimiter ist, warum steht der dann nur am Anfang?
                also ich sehe den / in den beiden eingangs geposteten beispielen am anfang und am ende, du nicht ...?

                "/\/\/[^\/]*(.*)/"
                "/\/\/[^\/]*)/"
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar


                • #9
                   ?$_?ginal geschrieben von graf [/i]
                  kann MIR jetzt noch einmal einer erklären, warum ich nun in
                  $pathonly[0] alles drin habe (ab // inkl.) und in $pathonly[1], nur das, was von
                  "/\/\/[^\/]*" nicht erfasst wird?

                  mit den regulären ausdrücken habe ich so meine verständnisschwierigkeiten, gerade was diese delimiter angeht, und die Teilmuster-Klammerung.
                  [/QUOTE]

                  $array[0] erfasst immer den gesammten Teil auf der der komplette Ausdruck passt. In $array[1] bis [...x] wird dann immer der Teil gespeichert, auf den jeweils der geklammerte Ausdruck passt, angefangen bei der ersten geöffnetten Klammer von links.
                  Alles was in Klammen steht, wird automatisch gespeichert.

                  Um das mal einfach darzustellen

                  abc(defg(hijk))lmn(opq)rst

                  [0] = abcdefghijklmnopqrst
                  [1] = defghijk (erstes geöffnettes Klammernpaar)
                  [2] = hijk (zweites geöffnettes Klammernpaar)
                  [3] = opq (drittes geöffnettes Klammernpaar)

                  Zu den Delimitern:
                  Die Delimiter dienen dazu dem Befehl, der RegExp verarbeitet mitzuteilen wo ein RegExp aufhört und evtl. optionale Optionen angehängt werden.
                  Ein Delimiter kann jedes beliebige Zeichen sein, so lange es nicht selbst im RegExp vorkommt. Oder es muß wie oben durch einen Backslash gekennzeichnet werden.
                  Der besseren Lesbarkeit halber sollte man doch ein anderes Zeichen verwenden.
                  Der obere Befehl
                  preg_match( "/\/\/[^\/]*(.*)/",...
                  könnte auch so aussehen:
                  preg_match( "#//[^/]*(.*)#",...
                  oder
                  preg_match( "$//[^/]*(.*)$",...
                  und ist somit schon etwas lesbarer.

                  Die Optionen werden hinter dem abschließenden Delimiter angehängt, z.B.:
                  preg_match( "#//[^/]*(.*)#isU",...


                  Grüße, Andi

                  Kommentar


                  • #10
                    Danke. Das mit den Delimitern hab ich nach Studium des Tutorials gecheckt.
                    aber um nochmal auf das Beispiel zurückzukommen (mit anderem delimiter )...

                    "#\/\/[^\/]*(.*)#"

                    Original geschrieben von andik2000
                    $array[0] erfasst immer den gesammten Teil auf der der komplette Ausdruck passt.
                    In $array[1] bis [...x] wird dann immer der Teil gespeichert, auf den jeweils der geklammerte Ausdruck passt, angefangen bei der ersten geöffnetten Klammer von links.
                    wieso steht in array[0] alles? es ist so, ich weiß, nur ich würde behaupten, der gesamte ausdruck passt darauf nicht.
                    denn es heisst ja
                    [^\/] also // gefolgt von allem ausser /, und damit würde doch alles nicht auf den ausdruck passen.


                    OOoooooohhhh, ich glaube jetzt in diesem Moment ..... aber bevor ich wieder alles lösche ...
                    also in diesem beispiel: http://www.google.de/search.html

                    in [0] :
                    passt //www.google.de auf den teil -> "#\/\/[^\/]*#"
                    und /search.html auf den teil -> (erster Teil des pattern gefolgt von) "(.*)"
                    ergibt zusammengesetzt also alles.

                    da war dann wohl auch bisher mein denkfehler, es wird zusammengesetzt.
                    Zuletzt geändert von graf; 03.07.2003, 11:52.

                    Kommentar


                    • #11
                      Fast richtig gedacht. Ich denke nicht, dass da der vordere Teil mit dem in den Klammern in [0] zusammengesetzt wird. Es ist einfach so, dass der gesammte Teil, der auf den gesammten Ausdruck passt in [0] gespeichert wird (mit oder ohne Klammern). Es ist einfach das Ergebnis des kompletten Ausdrucks.
                      Und ZUSÄTZLICH wird dann noch in den weiteren Variablen jeweils ein geklammerter Teil abgelegt. Um zum Beispiel wie in diesem Fall Domain und Verzechnisse von einander zu trennen.

                      Wer mehr über RegExp wissen will, dem Kann ich nur das Buch "Reguläre Ausdrücke" von E.F. Friedel, erschienen bei O´Reily empfehlern. Gibts auch gebraucht günstig bei Amazon. Danach ist man echt der RexExp(erte). Ich habe erst 2 von 7 Kapiteln gelesen und habe seit zwei Monaten nicht mehr weiter gelesen, weil ich bisher schon alles was ich an RegExp brauche damit behandeln kann. (Na gut, ich hatte schon ein bisschen Vorwissen) Aber gerade Anfänger lernen damit alles.
                      Das Buch ist zwar stark auf Perl bezogen aber die Funktionsweise von RegExp ist wohl in allen Sprechen gleich. Ich habe bisher noch keine Unterschiede von dem gelesenen zu PHP feststellen können.

                      Grüße, Andi

                      Kommentar

                      Lädt...
                      X