Michi: Reguläre Ausdrücke

Hallo Forum,
nun habe ich mich registriert *freu*

Ich lerne seit 2 Tagen reguläre Ausdrücke, damit ich mich an mod_rewrite ranmachen kann. (Martin hat mir ja schon nen Überblick gewährt)

Angefangen habe ich mit folgende Seite:
http://www.netzonaut.de/?p=237

Das meiste habe ich auch verstanden. Nun meine Fragen:

1. ? + * funktionieren bei Zeichenklassen oder direkt. Richtig? /[a-z]*/ oder /foobar*/. Das letztere heißt, dass fooba funktioniert oder foobar mit beliebig vielen 'r'

2. ^ vor einer Zeichenklasse bedeutet 'nicht'. Wenn man ^ direkt einsetzt, bedeutet es, dass es am Anfang steht.
/[^abc]/ heißt, dass alle Buchstaben außer a, b und c gehen.
/^abc/ heißt, dass abc am Anfang sein muss. Also würde alles gehen, was mit abc anfängt? Richtig?

3. Klammern bedeuten, dass das in der Klammer gespeichert wird, bzw. man dem Inhalt eine Eigenschaft zuweisen kann. /((?i)foo)bar/ Der Klammer weisen wir eine Eigenschaft zu, indem wir innerhalb noch eine Klammer mit der Eigenschaft zuweisen. Das Fragezeichen bedeutet in einer Klammer aber nur, dass jetzt ein Modifier kommt ne? Also das ? bedeutet hier nicht:
"? entspricht {0,1}, also entweder das Zeichen taucht gar nicht auf oder höchstens 1 mal."

4. Warum kommt bei dieser Schreibweise /(foo)bar/ folgende ausgabe: foobar und foo? Das foo steht zwar in Klammern, aber hat doch keinerlei Eigenschaft zugewiesen bekommen? Was bedeutet die Klammern in diesem Fall.

5. Lerne noch fleißig mod_rewrite. Habe zwei deutsche Seiten gefunden:
http://sw-guide.de/webdesign-und-entwicklung/htaccess-mod_rewrite-fuer-cms-und-blog/
und http://suchmaschinentricks.at/tipps-tricks/mod_rewrite.html
Finde aber nichts verständliches, wo {HOST} {REQUEST} und vorallem die Modifier in den eckigen Klammern erklärt werden? Gibt es da eventuell eine Seite mit Erklärungen? (Am besten in deutsch?)

6. Ich hatte mir überlegt, dass der erste Pfad nach den Domain der Parameter für die page sein sollte:
www.domain.tld/gaestebuch/ bzw. www.domain.tld/gaestebuch -> www.domain.tld/index.jsp?page=gaestebuch
www.domain.tld/fotogalerie/ -> www.domain.tld/index.jsp?page=fotogalerie

index.jsp prüft dann, ob es die pages auch gibt. Nun überlege ich, ob ich weitere Parameter dann einfach dahinter hänge und einfach weiterreiche oder daraus Pfade mache:

Also von:
www.domain.tld/index.jsp?page=fotogalerie&ort=stuttgart&fest=diskobla...
Da könnten noch viele Parameter sein, wie Datum, auf welcher Seite ich mich gerade in der Galerie befinde bei 200-300 Bildern, später die Bildansicht (bildid) usw.

auf:
www.domain.tld/fotogalerie/stuttgart/diskobla/...

oder lieber nur die Parameter anhängen: www.domain.tld/fotogalerie/ort=stuttgart&fest=diskobla...

:-)

Viele Grüße und nen guten Abend noch
Michi

  1. Hi,

    1. ? + * funktionieren bei Zeichenklassen oder direkt.

    sie beziehen sich auf das vorgehende Pattern, welches unter anderem auch eine Zeichenklasse oder ein "gewöhnliches" (im Sinne von "ohne Sonderbedeutung bei RegExp") Zeichen sein kann. Innerhalb einer Zeichenklasse haben sie keine Sonderbedeutung.

    1. ^ vor einer Zeichenklasse bedeutet 'nicht'. Wenn man ^ direkt einsetzt, bedeutet es, dass es am Anfang steht.

    Richtig, wobei "vor einer Zeichenklasse" als "als erstes Zeichen in einer Zeichenklasse" gemeint sein muss.

    /[^abc]/ heißt, dass alle Buchstaben außer a, b und c gehen.

    Alle Zeichen, nicht nur alle Buchstaben.

    /^abc/ heißt, dass abc am Anfang sein muss. Also würde alles gehen, was mit abc anfängt? Richtig?

    Ja. Mit dem Schalter /m ist "Anfang" als "Anfang einer Zeile" zu verstehen.

    1. Klammern bedeuten, dass das in der Klammer gespeichert wird, bzw. man dem Inhalt eine Eigenschaft zuweisen kann.

    Zunächst. Beginnt der Klammerninhalt mit einem Fragezeichen, gelten besondere Regeln, die diese Speicherung beispielsweise unterbinden können.

    Also das ? bedeutet hier nicht:
    "? entspricht {0,1}, also entweder das Zeichen taucht gar nicht auf oder höchstens 1 mal."

    Korrekt. Andernfalls würde es bedeuten, dass die öffnende runde Klammer 0 oder 1 mal auftreten soll - sie hat jedoch eine vollkommen andere Bedeutung.

    1. Warum kommt bei dieser Schreibweise /(foo)bar/ folgende ausgabe: foobar und foo?

    Weil Du $0 und $1 ausgibst. $0 ist immer der komplette mit dem Pattern gematchte String. Erst $1 enthält den Match des ersten geklammerten Ausdrucks.

    1. Lerne noch fleißig mod_rewrite. Habe zwei deutsche Seiten gefunden:

    Halte Dich am besten an die Dokumentation.

    1. Ich hatte mir überlegt, dass der erste Pfad nach den Domain der Parameter für die page sein sollte:

    Verwende bei Beispiel-Domains bitte die in RFC 2606 festgelegten Schemata.

    index.jsp prüft dann, ob es die pages auch gibt.

    Möglicherweise ist dies bereits mit RewriteCond möglich.

    Nun überlege ich, ob ich weitere Parameter dann einfach dahinter hänge und einfach weiterreiche oder daraus Pfade mache:

    Die Idee halte ich in dieser Allgemeinheit für riskant.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      zwei kleine Anmerkungen noch:

      »» 1. ? + * funktionieren bei Zeichenklassen oder direkt.
      sie beziehen sich auf das vorgehende Pattern, welches unter anderem auch eine Zeichenklasse oder ein "gewöhnliches" (im Sinne von "ohne Sonderbedeutung bei RegExp") Zeichen sein kann. Innerhalb einer Zeichenklasse haben sie keine Sonderbedeutung.

      Wobei das ? auch noch die Bedeutung haben kann, ein vorhergehendes + oder * non-greedy zu machen.
      Und, wie weiter unten erwähnt, auch noch im Zusammenhang mit Klammerungen eine Rolle spielt.

      Richtig, wobei "vor einer Zeichenklasse" als "als erstes Zeichen in einer Zeichenklasse" gemeint sein muss.
      »» /[^abc]/ heißt, dass alle Buchstaben außer a, b und c gehen.
      Alle Zeichen, nicht nur alle Buchstaben.

      In Abhängigkeit vom i-Flag ggf. auch außer A, B, C

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Hi,

        »» »» 1. ? + * funktionieren bei Zeichenklassen oder direkt.
        »» sie beziehen sich auf das vorgehende Pattern, welches unter anderem auch eine Zeichenklasse oder ein "gewöhnliches" (im Sinne von "ohne Sonderbedeutung bei RegExp") Zeichen sein kann. Innerhalb einer Zeichenklasse haben sie keine Sonderbedeutung.

        Wobei das ? auch noch die Bedeutung haben kann, ein vorhergehendes + oder * non-greedy zu machen.
        Und, wie weiter unten erwähnt, auch noch im Zusammenhang mit Klammerungen eine Rolle spielt.

        Danke. Für greedy habe ich zufällig schön folgende verständliche Erklärung gefunden:
        http://www.mediamill.de/blog/2008/05/13/problem-mit-regulaeren-ausruecken/

        »» Richtig, wobei "vor einer Zeichenklasse" als "als erstes Zeichen in einer Zeichenklasse" gemeint sein muss.
        »» »» /[^abc]/ heißt, dass alle Buchstaben außer a, b und c gehen.
        »» Alle Zeichen, nicht nur alle Buchstaben.

        In Abhängigkeit vom i-Flag ggf. auch außer A, B, C

        habe ich nicht verstanden. Du meinst, wenn anstatt /[^abc]/ dies wäre: /((?i)[^abc])/?
        Dann alle Zeichen, außer a, b, c und A, B, C

        Grüße

        1. Hi,

          »» In Abhängigkeit vom i-Flag ggf. auch außer A, B, C

          habe ich nicht verstanden. Du meinst, wenn anstatt /[^abc]/ dies wäre: /((?i)[^abc])/?

          ja, oder "/[^abc]/i".

          Dann alle Zeichen, außer a, b, c und A, B, C

          Genau.

          Cheatah

          --
          X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
    2. Hi Cheatah, danke für die schnelle Antwort.

      »» /^abc/ heißt, dass abc am Anfang sein muss. Also würde alles gehen, was mit abc anfängt? Richtig?

      Ja. Mit dem Schalter /m ist "Anfang" als "Anfang einer Zeile" zu verstehen.

      Schalter /m. Wie würde ich das oben einbauen, da / ja der Delimiter ist.

      //mabc/
      bzw mit Klammer ((?m)abc)

      »» 4. Warum kommt bei dieser Schreibweise /(foo)bar/ folgende ausgabe: foobar und foo?

      Weil Du $0 und $1 ausgibst. $0 ist immer der komplette mit dem Pattern gematchte String. Erst $1 enthält den Match des ersten geklammerten Ausdrucks.

      Ahja, ok. Er gibt ja die "gespeicherten" Zuweisungen mit $0 und $1 aus.

      Wenn ich jedoch auf einen Teilstring "foobar" folgende Regex anwende "/(foo)bar", dann käme als Ergebnis, was zutrifft, nur foobar ne?
      Oder verstehe ich gerade etwas ganz falsch?

      »» 5. Lerne noch fleißig mod_rewrite. Habe zwei deutsche Seiten gefunden:

      Halte Dich am besten an die Dokumentation.

      schuldigung, werde in zukunft dann immer example nehmen.

      »» 6. Ich hatte mir überlegt, dass der erste Pfad nach den Domain der Parameter für die page sein sollte:

      Verwende bei Beispiel-Domains bitte die in RFC 2606 festgelegten Schemata.

      »» index.jsp prüft dann, ob es die pages auch gibt.

      Möglicherweise ist dies bereits mit RewriteCond möglich.

      Für kleine, bzw. wenige Pages wäre das Interessant.

      »» Nun überlege ich, ob ich weitere Parameter dann einfach dahinter hänge und einfach weiterreiche oder daraus Pfade mache:

      Die Idee halte ich in dieser Allgemeinheit für riskant.

      Die Idee, die Parameter anzuhängen oder einen ausführlichen Pfad /stuttgart/fest/2009/... zu machen?

      Wenn ich die regulären Ausdrucke verstanden habe, versuche ich mich so langsam dann an mod_rewrite heranzumachen. Zum Lernen hatte ich mir halt eine Fotogalerie ausgedacht, damit ich das bessere verstehe, vorallem, weil man bei einer Galerie viele Parameter hat. (Evtl. könnte man dies auch vermeiden und die URL simpel halten)

      (Davor hatte ich immer mir Parameter gerarbeitet, ohne mod_rewrite und hatte versucht immer nur mit Zahlen zu arbeiten und keine Strings direkt als Parameterinhalt zu empfangen. Bei mod_rewrite müsste ich womöglich viele Strings empfangen und bereinigen, wobei man sicher auch ID's irgendwie in die URL unterjubeln kann)

      Grüße

      1. Hi,

        /^abc/ heißt, dass abc am Anfang sein muss. Also würde alles gehen, was mit abc anfängt? Richtig?

        Ja. Mit dem Schalter /m ist "Anfang" als "Anfang einer Zeile" zu verstehen.

        Schalter /m. Wie würde ich das oben einbauen, da / ja der Delimiter ist.

        //mabc/
        bzw mit Klammer ((?m)abc)

        Nein, diese Schalter - engl. Modifier - betreffen immer den gesamten Ausdruck, und werden deshalb nach dem abschliessenden Delimiter notiert:

        /^abc/m

        Mehrere Modifier werden einfach nacheinander aufgelistet, also wenn zum m bspw. noch i hinzukommen soll:

        /^abc/mi

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. Nein, diese Schalter - engl. Modifier - betreffen immer den gesamten Ausdruck, und werden deshalb nach dem abschliessenden Delimiter notiert:

          Nein, nicht notwendigerweise.

          (?abc-def:Teilausdruck)

          schaltet die (fiktiven) Flags/Modifier abc für den Teilausdruck ein und die (ebenso fiktiven) Flags def für den Teilausdruck aus.
          Wobei auch (?a:Teilausdruck) und (?-df:Teilausdruck) möglich sind, es müssen also nur die Flags angegeben werden, die explizit ein- bzw. ausgeschaltet werden sollen.

          /^abc/m
          Mehrere Modifier werden einfach nacheinander aufgelistet, also wenn zum m bspw. noch i hinzukommen soll:

          Bei Verwendung dieser Syntax gelten die Modifier für den gesamten Ausdruck, soweit sie nicht über die von mir genannte Syntax für Teilausdrücke überschrieben werden.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          1. Hi,

            »» Nein, diese Schalter - engl. Modifier - betreffen immer den gesamten Ausdruck, und werden deshalb nach dem abschliessenden Delimiter notiert:

            Nein, nicht notwendigerweise.

            Ups, hab dem ChrisB geantwortet, ohne dies als erstes durchgelesen zu haben. Das "immer" hatte ich auch in Frage gestellt.

            (?abc-def:Teilausdruck)

            schaltet die (fiktiven) Flags/Modifier abc für den Teilausdruck ein und die (ebenso fiktiven) Flags def für den Teilausdruck aus.
            Wobei auch (?a:Teilausdruck) und (?-df:Teilausdruck) möglich sind, es müssen also nur die Flags angegeben werden, die explizit ein- bzw. ausgeschaltet werden sollen.

            Ich schau mal ob ich die Syntax verstanden habe:

            (?abc-def:Teilausdruck)

            /(?i:foo)bar/ - Schaltet den Schalter i für den Teilausdruck "foo" ein
            Oder anstatt des Doppelpunktes einfach doppelt Klammern /((?i)foo)bar/

            /(?-i:foo)bar/ - Schaltet den Schalter i für den Teilausdruck "foo" aus

            Grüße

            1. Hi,

              /(?i:foo)bar/ - Schaltet den Schalter i für den Teilausdruck "foo" ein

              Richtig.

              Oder anstatt des Doppelpunktes einfach doppelt Klammern /((?i)foo)bar/

              Das ist etwas anderes!
              Zwar wird auch hier für den Teilausdruck foo das i-Flag gesetzt, aber hier wird auch noch der Teilausdruck in der Klammer () gespeichert.

              (?:(?i)foo)bar  wäre äquivalent zu (?i:foo)bar

              /(?-i:foo)bar/ - Schaltet den Schalter i für den Teilausdruck "foo" aus

              Richtig.

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              O o ostern ...
              Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
              1. Hi,

                »» /(?i:foo)bar/ - Schaltet den Schalter i für den Teilausdruck "foo" ein

                Richtig.

                cool. Bin auf dem richtigen weg.

                »» Oder anstatt des Doppelpunktes einfach doppelt Klammern /((?i)foo)bar/

                Das ist etwas anderes!
                Zwar wird auch hier für den Teilausdruck foo das i-Flag gesetzt, aber hier wird auch noch der Teilausdruck in der Klammer () gespeichert.

                Oki, ich erkläre mir das dann so, sobalb das erste Zeichen in einer Klammer mit ? beginnt, wird es nicht gespeichert, ansonsten dient es der Speicherung.

                (?:(?i)foo)bar  wäre äquivalent zu (?i:foo)bar

                Sieht ehrlich gesagt komisch aus das erste :-)

                /(?:(?i)foo)/ <-> /(?i:foo)/ <-> /foo/i
                geht auch nur:
                /(?i)foo/

                Grüße

        2. Hi,

          Nein, diese Schalter - engl. Modifier - betreffen immer den gesamten Ausdruck, und werden deshalb nach dem abschliessenden Delimiter notiert:

          /^abc/m

          Mehrere Modifier werden einfach nacheinander aufgelistet, also wenn zum m bspw. noch i hinzukommen soll:

          /^abc/mi

          Die Schalter betreffen "immer" den gesamten Ausdruck?

          Hier hat er den Schalter ja nur auf die Klammer (foo) angewendet:
          /((?i)foo)bar/

          Dann müsste auch
          /((?m)foo)bar/ funktionieren?

          Grüße

      2. Hi,

        »» $0 ist immer der komplette mit dem Pattern gematchte String. Erst $1 enthält den Match des ersten geklammerten Ausdrucks.

        Ahja, ok. Er gibt ja die "gespeicherten" Zuweisungen mit $0 und $1 aus.

        Wenn ich jedoch auf einen Teilstring "foobar" folgende Regex anwende "/(foo)bar", dann käme als Ergebnis, was zutrifft, nur foobar ne?
        Oder verstehe ich gerade etwas ganz falsch?

        wenn Du ein Pattern hast, das innerhalb des angewendeten Strings matcht, dann enthält $0 immer den gesamten Match - unabhängig von allen Klammern. Die RegExp /(Fo+)ba(r)/ angewendet auf "Ich gehe in die Foobar und trinke etwas" liefert in $0 "foobar". Alles ab $1 enthält die gematchten Klammern, also $1 den Inhalt der ersten Klammer (hier "foo"), $2 den Inhalt der zweiten Klammer ("r") und so weiter.

        schuldigung, werde in zukunft dann immer example nehmen.

        Für fehlendes Wissen brauchst Du Dich nicht zu entschuldigen :-)

        »» Möglicherweise ist dies bereits mit RewriteCond möglich.
        Für kleine, bzw. wenige Pages wäre das Interessant.

        Korrekt. Auch bei vielen kann es interessant sein, da oft ein Schema existiert, welches man mit RewriteCond und RewriteRule leicht umsetzen kann. Es lässt sich beispielsweise leicht prüfen, ob eine assoziierte Datei existiert.

        »» »» Nun überlege ich, ob ich weitere Parameter dann einfach dahinter hänge und einfach weiterreiche oder daraus Pfade mache:
        »» Die Idee halte ich in dieser Allgemeinheit für riskant.
        Die Idee, die Parameter anzuhängen oder einen ausführlichen Pfad /stuttgart/fest/2009/... zu machen?

        Letzteres. Parameter werden gerne mal in einer anderen Reihenfolge auftreten, als Du sie vorgesehen hast. Ich halte es für sinnvoll, hierauf vorbereitet zu sein.

        Wenn ich die regulären Ausdrucke verstanden habe, versuche ich mich so langsam dann an mod_rewrite heranzumachen. Zum Lernen hatte ich mir halt eine Fotogalerie ausgedacht, damit ich das bessere verstehe, vorallem, weil man bei einer Galerie viele Parameter hat. (Evtl. könnte man dies auch vermeiden und die URL simpel halten)

        Mir gefällt Deine Vorgehensweise.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Morgen,

          wenn Du ein Pattern hast, das innerhalb des angewendeten Strings matcht, dann enthält $0 immer den gesamten Match - unabhängig von allen Klammern. Die RegExp /(Fo+)ba(r)/ angewendet auf "Ich gehe in die Foobar und trinke etwas" liefert in $0 "foobar". Alles ab $1 enthält die gematchten Klammern, also $1 den Inhalt der ersten Klammer (hier "foo"), $2 den Inhalt der zweiten Klammer ("r") und so weiter.

          Oki, ich habe es meiner Meinung nach dann definitiv verstanden, wie das gemeint ist, auch wenn ich eine Problematik nicht mit den Fachwörtern schöner beschreiben könnte.
          Mit Pattern meint man das Suchmuster, welches angewendet wird.
          Mit matchen, ob das Suchmuster passt. No match, keine Übereinstimmung, Match -> Die Übereinstimmung. Wie auch immer. Das ist eher Kleinkram.

          »» schuldigung, werde in zukunft dann immer example nehmen.

          Für fehlendes Wissen brauchst Du Dich nicht zu entschuldigen :-)

          »» »» Möglicherweise ist dies bereits mit RewriteCond möglich.
          »» Für kleine, bzw. wenige Pages wäre das Interessant.

          Korrekt. Auch bei vielen kann es interessant sein, da oft ein Schema existiert, welches man mit RewriteCond und RewriteRule leicht umsetzen kann. Es lässt sich beispielsweise leicht prüfen, ob eine assoziierte Datei existiert.

          "[..] eine assoziierte Datei existiert."
          Das habe ich leider nicht verstanden. Was meint man mit assoziierte Datei?

          »» Wenn ich die regulären Ausdrucke verstanden habe, versuche ich mich so langsam dann an mod_rewrite heranzumachen. Zum Lernen hatte ich mir halt eine Fotogalerie ausgedacht, damit ich das bessere verstehe, vorallem, weil man bei einer Galerie viele Parameter hat. (Evtl. könnte man dies auch vermeiden und die URL simpel halten)

          Mir gefällt Deine Vorgehensweise.

          Danke, ich versuch mein Bestes, ohne dass ich Euch mit Fragen nerve/überheufe :-)
          Wegen der Fotogalerie mit mod_rewrite eröffne ich später einen eigenen Thread, wenn ich das einwenig durchgearbeitet habe, wie man das realisieren könnte.

          Ich bedanke mich übrigens nochmal bei allen, die geantwortet und sich Zeit genommen haben.

          Grüße

          1. Hi,

            Korrekt. Auch bei vielen kann es interessant sein, da oft ein Schema existiert, welches man mit RewriteCond und RewriteRule leicht umsetzen kann. Es lässt sich beispielsweise leicht prüfen, ob eine assoziierte Datei existiert.

            "[..] eine assoziierte Datei existiert."
            Das habe ich leider nicht verstanden. Was meint man mit assoziierte Datei?

            Das "normale" Verhalten des Apachen bei einem hereinkommenden Request nach /verzeichnis/datei.xyz ist, dass er schaut, ob es ein Verzeichnis namens "verzeichnis" und darin eine Datei namens "datei.xyz" gibt - wenn ja, liefert er diese aus, wenn nicht gibt's einen 404 File Not Found.

            mod_rewrite bietet dir jetzt (u.a.) die Möglichkeit, Requests, zu denen keine 1:1-Entsprechung in Form von Verzeichnissen und Dateien im Dateisystem vorhanden ist, umzuschreiben - so kann ich also bspw. /weblog/artikel/2009/04/Schweinegrippe als Adresse nutzen, ohne dass es diesen Pfad physisch auf meinem Server gibt; mod_rewrite schreibt mir das auf meinen Wunsch hin in einen Scriptaufruf mit irgendwelchen GET-Parametern um, an Hand derer ich dann die Daten aus der Datenbank ziehe.

            Jetzt möchte man aber oft nicht, dass bestimmte Requests umgeschrieben werden - die nach CSS-, JavaScript- und Bild-Ressourcen beispielsweise. Die liegen meist als physische Dateien vor, die kann der Apache sich direkt von der Platte holen und ausliefern - da noch mein Script "zwischenzuschalten", welches dann selber die Dateien einliest und mit passenden Headern ausgibt, wäre im Normalfall unsinnig, weil unperformant.
            Also kann ich jetzt entweder meine RewriteRule(s) spezifischer formulieren - so dass sie Requests, die "Dateiendungen" wie .css etc. enthalten, nicht berücksichtigen.
            Oder aber ich nutze eine/mehrere RewriteConds vor der RewriteRule, die die Anwendung dieser davon abhängig machen, ob ein Verzeichnis oder eine Datei im Dateisystem existiert, das/die zum Request "passt" - und überlasse dann in diesem Falle die Auslieferung wieder dem Standardmechanismus des Apachen.

            MfG ChrisB

            --
            Light travels faster than sound - that's why most people appear bright until you hear them speak.
            1. Hi,

              [..]  Also kann ich jetzt entweder meine RewriteRule(s) spezifischer formulieren - so dass sie Requests, die "Dateiendungen" wie .css etc. enthalten, nicht berücksichtigen.
              Oder aber ich nutze eine/mehrere RewriteConds vor der RewriteRule, die die Anwendung dieser davon abhängig machen, ob ein Verzeichnis oder eine Datei im Dateisystem existiert, das/die zum Request "passt" - und überlasse dann in diesem Falle die Auslieferung wieder dem Standardmechanismus des Apachen.

              ach so. oki doki, danke für die sehr ausführliche Antwort.

              Muss kurz von mod_rewrite wieder abweichen und hoffe, dass dies einer meiner letzten Fragen diesbezüglich ist:

              1. /[a-c-g]/ heißt, entweder ein Buchstabe von a bis c oder das Bindestrich oder ein g. Synonym dazu ist: /[abc-g]/
              Was ist an dem \ jetzt so besonders mitten in einer Zeichenkette? Mit \* könnte ich sagen, dass das * als Zeichen erkannt werden soll. Aber in einer Zeichenkette würde das * doch eh als Zeichenkette erkannt werden [a-b-*]. Also Synonym zu [a-b-\*] wobei \w, \d usw. ja eine Sonderbedeutung haben...

              2. Diese Symbolkombination habe ich auch nicht ganz verstanden: ++, *+, ?+ und {min,max}+.

              3. Wenn ich noch Look-around assertions durchgemacht habe morgen, dürfte ich hoffentlich "fertig" sein, bzw. eine kleine Grundausbildung hinter mir :-)

              Gute Nacht
              Michi

              1. Hallo,

                1. /[a-c-g]/ heißt, entweder ein Buchstabe von a bis c oder das Bindestrich oder ein g.

                äh, ja ... und sehr unkonventionell.

                Was ist an dem \ jetzt so besonders mitten in einer Zeichenkette?

                Der Backslash dient als Escape-Zeichen und nimmt einem nachfolgenden Sonderzeichen seine Sonderbedeutung. Er erzwingt, dass das nachfolgende Zeichen einfach "wörtlich" genommen wird.

                Mit \* könnte ich sagen, dass das * als Zeichen erkannt werden soll.

                Genau.

                Aber in einer Zeichenkette würde das * doch eh als Zeichenkette erkannt

                Nein: In einem normalen RegEx-Pattern würde ein Stern '*' logisch dem vorangehenden Zeichen als Quantifier zugeordnet.

                1. Diese Symbolkombination habe ich auch nicht ganz verstanden:

                ++  ergibt IMHO keinen Sinn, weil das erste '+' dem vorangehenden Zeichen
                      als Quantifier zugeordent wird
                  *+  ähnlich wie der vorhergehende Fall
                  ?+  auch hier vermutlich falsch gruppiert: Das '?' wird dem vorhergehenden
                      Zeichen zugerechnet und bedeutet: einmal oder auch gar nicht
                 {min,max}+  Ergibt IMHO auch keinen Sinn

                So long,
                 Martin

                --
                Ein Snob ist ein Mensch, der sich auf ein Stachelschwein setzt, ohne eine Miene zu verziehen - nur weil ihm jemand gesagt hat, das sei ein Designersessel.
                1. Hi,

                  ++  ergibt IMHO keinen Sinn, weil das erste '+' dem vorangehenden Zeichen als Quantifier zugeordent wird
                    *+  ähnlich wie der vorhergehende Fall
                    ?+  auch hier vermutlich falsch gruppiert: Das '?' wird dem vorhergehenden Zeichen zugerechnet und bedeutet: einmal oder auch gar nicht

                  ++ und *+ und ?+ sind die possessive Quantifiers.

                  cu,
                  Andreas

                  --
                  Warum nennt sich Andreas hier MudGuard?
                  O o ostern ...
                  Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                  1. Hallo,

                    »»   ++  ergibt IMHO keinen Sinn, weil das erste '+' dem vorangehenden Zeichen als Quantifier zugeordent wird
                    »»   *+  ähnlich wie der vorhergehende Fall
                    »»   ?+  auch hier vermutlich falsch gruppiert: Das '?' wird dem vorhergehenden Zeichen zugerechnet und bedeutet: einmal oder auch gar nicht

                    ++ und *+ und ?+ sind die possessive Quantifiers.

                    danke, das kannte ich bisher noch nicht.
                    Wenn du jetzt noch eine Beschreibung verlinkt, oder noch besser: den Kerngedanken in kurzen Stichworten erklärt hättest, wäre deine Antwort perfekt gewesen.

                    Schönes Wochenende,
                     Martin

                    --
                    F: Was ist schneller: Das Licht oder der Schall?
                    A: Offensichtlich der Schall. Wenn man den Fernseher einschaltet, kommt immer erst der Ton, und dann erst das Bild.
                    1. Hi,

                      »» ++ und *+ und ?+ sind die possessive Quantifiers.
                      danke, das kannte ich bisher noch nicht.
                      Wenn du jetzt noch eine Beschreibung verlinkt, oder noch besser: den Kerngedanken in kurzen Stichworten erklärt hättest, wäre deine Antwort perfekt gewesen.

                      Das wollte ich Dir _self_ überlassen.

                      cu,
                      Andreas

                      --
                      Warum nennt sich Andreas hier MudGuard?
                      O o ostern ...
                      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                      1. Guten abend,
                        ich habe wahrscheinlich mein Posting an die falsche Stelle geschrieben, so dass es untergetaucht ist ;)

                        Klick

                        So im groben und ganzen bin ich durch. Nach ein paar kleinen Übungen versuch ich mich mit mod_rewrite und hoffe, dass ich da auch vorankomme. Danach muss ich noch einwenig den Tomcat kapieren, aber da komme ich irgendwie nicht vom Fleck:

                        Tomcat Webserver Portfrage

                        Nen schönen Wochenende euch allen noch
                        Grüße
                        Michi

                2. Moin,

                  »» 1. /[a-c-g]/ heißt, entweder ein Buchstabe von a bis c oder das Bindestrich oder ein g.

                  äh, ja ... und sehr unkonventionell.

                  »» Was ist an dem \ jetzt so besonders mitten in einer Zeichenkette?

                  Der Backslash dient als Escape-Zeichen und nimmt einem nachfolgenden Sonderzeichen seine Sonderbedeutung. Er erzwingt, dass das nachfolgende Zeichen einfach "wörtlich" genommen wird.

                  Sonderbedeutung, ja. Wie in Java in der Zeichenkette.
                  Aber das "wörtlich" nehmen ist ja nicht immer so

                  Im folgenden Fall nimmt er das "d" ja nicht wörtlich:

                  [a-z\dABC]

                  Also, entweder alle Kleinbuchstaben von a-z, eine Zahl oder A, B, C.

                  »» Mit \* könnte ich sagen, dass das * als Zeichen erkannt werden soll.

                  Genau.

                  »» Aber in einer Zeichenkette würde das * doch eh als Zeichenkette erkannt

                  Nein: In einem normalen RegEx-Pattern würde ein Stern '*' logisch dem vorangehenden Zeichen als Quantifier zugeordnet.

                  Das hatte mich irritiert, weil der Quantifier ja nur außerhalb von Zeichenklassen gehen sollte. (Netzonaut)

                  D.h.,
                  [abcAB*] sollte ganz normal als Stern erkannt werden. Deshalb hat es mich nun irritiert, warum man den \ einsetzen muss [abcAB\*]
                  Außerhalb wäre es ganz normal als Quantifier, das ist klar [abcAB]*

                  Grüße

  2. Hi,

    Ich lerne seit 2 Tagen reguläre Ausdrücke, damit ich mich an mod_rewrite ranmachen kann. (Martin hat mir ja schon nen Überblick gewährt)

    Wenn Dich das Thema wirklich interessiert, hol Dir das Buch "Mastering Regular Expressions" von Jeffrey E. F. Friedl, O'Reilly-Verlag

    Teuer, aber preiswert!

    Achtung: Nicht die Pocket Reference!

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.