[REGEX] Teil der URL matchen

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

  • [REGEX] Teil der URL matchen

    Hallo,
    sitz seit Stunden über einer RegEx ... bekomms einfach nicht hin ..

    Also.. was ich möchte:

    Ich nehm als Subject die Regex_Uri, gematcht werden soll der sprachcode ... also de, en, fr oder sonstwas .. wenn nicht vorhanden ... Sprachcode aus der Browser accept-language und dann redirecten

    Nun können die URL folgendermaßen aussehen ...

    example.com -> example.com/de/
    example.com/portfolio -> example.com/de/portfolio

    Erkannt wird auch, wenn:
    example.com/de/ oder example.com/de/portfolio, so erfolgt halt kein redirect.

    NICHT erkannt wird allerdings:
    example.com/de also einfach nur ohne abschließendes Slash ...
    Dumm natürlich, weil die meisten User zu faul sind um den letzten Slash zu tippen..ergo kann ich darauf nicht verzichten ...

    Ich verwende zur Zeit folgenden Code:

    PHP-Code:
    $url_request $_SERVER['REQUEST_URI'];

    if(!
    preg_match('&(([a-z]{2})+)/&'$url_request$matches) || 
       !
    preg_match('&(([a-z]{2})+)?/&'$url_request$matches)) {
        if(
    strstr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 'de')) {
            
    $user_lang 'de';
        } else {
            
    $user_lang 'en';
        }
        
    $header WWW_ROOT '/'.$user_lang $url_request;
        
    header("Location: $header");

    Die Konstante WWW_ROOT enthält lediglich http://example.com.

    Wäre super, wenn mir jemand helfen könnte, verzweifel allmählich..

    Grüße, Dennis
    Musik beflügelt unseren Geist

  • #2
    erweitere den letzten / durch den Quantifier ? also /?

    Kommentar


    • #3
      Hallo Tobiaz

      Ich habe jetzt nur noch diese Regex drin:
      !preg_match('&(([a-z]{2})+)/?&', $url_request, $matches)

      jetzt wird zwar example.com/de und example.com/de/ gematcht, aber sowas wie example.com/portfolio wird nicht mehr als fehlerhaft erkannt und nicht redirectet.

      Was da fehlt ist sowas wie, wenn kein Zeichen, oder ein beliebiges Zeichen ausser / nach den ersten 2 Buchstaben kommt, leite das Ganze um und nimm den bisherigen Request als Parameter...
      Musik beflügelt unseren Geist

      Kommentar


      • #4
        Ach so,

        ja dann entweder /? oder $ (ende des Strings)

        Kommentar


        • #5
          Kay, wenn ich /? durch $ ersetze gibts nen redirect-Fehler, weil dann immer gematcht wird, falls ich /?$ setze ist dasselbe Problem wie vorher...
          Bin ich so dumm oder will mein Lieblingslaptop mich nur wieder ärgern?!
          Musik beflügelt unseren Geist

          Kommentar


          • #6
            Warum nimmst du nicht einfach das? http://de.php.net/manual/en/function.parse-url.php
            [FONT="Helvetica"]twitter.com/unset[/FONT]

            Shitstorm Podcast – Wöchentliches Auskotzen

            Kommentar


            • #7
              Nicht ersetzen, sondern ODER.
              Bin ich so dumm oder will mein Lieblingslaptop mich nur wieder ärgern?!
              Wenn du darauf wirklich ne Antwort willst, dann kann dein Laptop mit Sicherheit nichts dafür. Der tut nur was man ihm sagt...
              Zuletzt geändert von TobiaZ; 06.07.2008, 15:00.

              Kommentar


              • #8
                Hier mal mein Code:

                PHP-Code:
                !preg_match('&(([a-z]{2}))/?&'$url_request$matches) or
                !
                preg_match('&(([a-z]{2}))/$&'$url_request$matches
                Macht er nicht, hab es auch schon mit $ also nicht /$ probiert ... Umleitungsfehler

                Versteh bald nix mehr..

                Klar macht mein Mac nur das was ich ihm sage ...

                Zumindest meistens ... nen bißchen Intelligenz, sprich eigenständige Korrektur von RegEx wäre echt praktisch ...

                @ unset

                Das ändert das Problem aber auch nicht, da parse_url auch nur nen array zurückgibt, wo dann als ein Teil der gesamte path zurückgegeben wird.
                Musik beflügelt unseren Geist

                Kommentar


                • #9
                  Du sollst das beides im Pattern unterbringen. Und das /$ macht natürlich gar keinen Sinn, weil das wieder voraussetzt, dass der User das / eingibt.

                  Kommentar


                  • #10
                    I versteh nix mehr ... egal, wie ich es versuche, der leitet es entweder garned um, oder er schmeißt ne Fehlermeldung raus ...
                    Wo in dem Pattern soll das denn bitte rein?

                    Sorry, dass ich dich damit so nerve!
                    Musik beflügelt unseren Geist

                    Kommentar


                    • #11
                      Du hast das mit den RegExp noch nicht so ganz verstanden, oder?

                      Die zeichen müssen natürlich da rein, wo sie auch erwartet werden. In deinem Fall ist das ja ganz offensichtlich das ende des Strings.

                      Kommentar


                      • #12
                        Stimmt... regex sind nicht wirklich meine Stärke.

                        Wenn ich das richtig verstehe, muss also sowas hier $/? in die Gruppe rein ...
                        (([a-z]{2})) und nicht dahinter ...
                        Musik beflügelt unseren Geist

                        Kommentar


                        • #13
                          dahinter ist schon okay. In der backreferenz wirds ja nicht gebraucht.

                          Dann musst du dir halt klar werden, dass entwerder ein / da sein soll, ODER das Ende des strings $. Wenn ichs mir Recht überlege, brauchst du das ? gar nicht.

                          !^([a-z]{2})(?=\/|$)!iUm
                          Zuletzt geändert von TobiaZ; 06.07.2008, 17:13.

                          Kommentar


                          • #14
                            Das mit dem Fragezeichen hatte ich mir auch eben überlegt, das OR bekomm ich ja über |
                            Habe deine regex ausprobiert, aber nichts ... umleitungsfehler ...
                            Im Moment versuch ich das Ganze in etwa so zu schreiben:

                            PHP-Code:
                            !(^[a-z]{2}$|^[a-z]{2}/$)! 
                            Also entweder 2 buchstaben und nix dahinter oder 2 buchstaben und ein / dahinter ...
                            Musik beflügelt unseren Geist

                            Kommentar


                            • #15
                              Habe deine regex ausprobiert, aber nichts ... umleitungsfehler ...
                              Wie sieht denn dein Subject aus?

                              m Moment versuch ich das Ganze in etwa so zu schreiben: PHP: !(^[a-z]{2}$|^[a-z]{2}/$)! Also entweder 2 buchstaben und nix dahinter oder 2 buchstaben und ein / dahinter ...
                              Und was ist mit de/portfolio? Schließt du ja wieder aus.

                              Kommentar

                              Lädt...
                              X