Andy: Reguläre Ausdrücke mit preg ...

Hallo,
kann mir jemand sagen, was ich hier falsch mache?

if (preg_match("/[(user)(menu)(cart)]/",$PHP_SELF)) { ... }

Ich möchte unterscheiden,
ob sich der User auf einer Seite "user", "menu", "cart" befindet, oder nicht.

Und nach meinem laienhaften Verständnis,
habe ich 3 Teilausdrücke,
die von eckigen ODER Klammern umrahmt sind.

Sollte jetzt nicht user ODER menu ODER cart gefunden werden?

Was mache ich falsch?
Danke, Andy

P.s.: Kann ich das auch mit strpos() oder irgendwas schnellerem
als preg_match() realisieren?

  1. Hi,

    kann mir jemand sagen, was ich hier falsch mache?
    if (preg_match("/[(user)(menu)(cart)]/",$PHP_SELF)) { ... }

    also, zunächst einmal wiederholst Du in der Zeichenklasse ziemlich viele Zeichen. Die RegExp lässt sich kürzer schreiben: /[()usermncat]/

    Ich möchte unterscheiden,
    ob sich der User auf einer Seite "user", "menu", "cart" befindet, oder nicht.

    Wieso benutzt Du dann eine Zeichenklasse?

    Und nach meinem laienhaften Verständnis,
    habe ich 3 Teilausdrücke,
    die von eckigen ODER Klammern umrahmt sind.

    Es gibt keine ODER-Klammern, nur ein ODER-Zeichen: "|".

    Was mache ich falsch?

    Übrigens sind auch die runden Klammern völlig überflüssig.

    P.s.: Kann ich das auch mit strpos() oder irgendwas schnellerem
    als preg_match() realisieren?

    Sicher. Du kannst Dir den gesuchten Teilstring extrahieren und einfach mit dem Gleichheitsoperator vergleichen.

    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, Cheatah
      Danke,
      hab' gerade doch noch was gefunden mit
      if (preg_match("/(user|_menu|cart)/",$PHP_SELF)) { ... }

      Scheint zu laufen mit | als oder ...
      Gruss, Andy

      1. Hi,

        if (preg_match("/(user|_menu|cart)/",$PHP_SELF)) { ... }

        hast Du die Klammern bewusst gesetzt, oder aus Gewohnheit?

        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 Cheatah
          aus Gewohnheit
          weil ich noch PHP-Newbie bin und dachte: "Schad' ja nix ..."

          Aber es scheint auch ohne zugehen ... *wunder*
          LG, Andy

          1. hi,

            aus Gewohnheit
            weil ich noch PHP-Newbie bin und dachte: "Schad' ja nix ..."

            Aber es scheint auch ohne zugehen ... *wunder*

            die klammerung brauchst du nur, wenn du "backreferences" erstellen willst - also teile des gefundenen ausdrucks auch beim ersetzen wiederverwenden willst.

            da du dies aber gar nicht brauchst, sind die klammern hier überflüssig.

            gruß,
            wahsaga

            --
            "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
            1. hi wahsaga,
              Aaaah, verstehe,
              und die sind dann für
              preg_match("/(12)(A-Z)/",$text,$array);
              in array[1], array[2] etc.

              Danke, wieder was dazugelernt o)
              Andy

              1. 你好 Andy,

                und die sind dann für
                preg_match("/(12)(A-Z)/",$text,$array);
                in array[1], array[2] etc.

                Naja, man muesste ([A-Z]) schreiben. Zeichenklassen muessen immer in []
                angegeben werden.

                再见,
                 CK

                --
                Microsoft: Where do you want to go today?
                Linux: Where do you want to go tomorrow?
                FreeBSD: Are you guys coming, or what?
                http://wwwtech.de/
            2. 你好 wahsaga,

              aus Gewohnheit
              weil ich noch PHP-Newbie bin und dachte: "Schad' ja nix ..."

              Aber es scheint auch ohne zugehen ... *wunder*

              die klammerung brauchst du nur, wenn du "backreferences" erstellen
              willst - also teile des gefundenen ausdrucks auch beim ersetzen
              wiederverwenden willst.

              Naja, das stimmt nicht ganz, manchmal (oefter) ist gruppieren unumgaenglich.

              再见,
               CK

              --
              73.255437% der Statistiken spielen eine Genauigkeit vor, die durch die angewandte Methode nicht gerechtfertigt wird.
              http://wwwtech.de/
              1. hi,

                Naja, das stimmt nicht ganz, manchmal (oefter) ist gruppieren unumgaenglich.

                ja, OK - bei komplexeren ausdrücken.
                wobei man dann das erstellen einer backreference ja ggf. wieder abschalten kann, wenn man sie für einen geklammerten teilausdruck nicht braucht.

                gruß,
                wahsaga

                --
                "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
                1. 你好 wahsaga,

                  Naja, das stimmt nicht ganz, manchmal (oefter) ist gruppieren
                  unumgaenglich.

                  ja, OK - bei komplexeren ausdrücken.

                  Was man so als komplex bezeichnet -- /a(b|c)/ ist was anderes als /ab|c/ :)

                  wobei man dann das erstellen einer backreference ja ggf. wieder abschalten
                  kann, wenn man sie für einen geklammerten teilausdruck nicht braucht.

                  Jepp, korrekt, dafuer gibts (?:).

                  再见,
                   CK

                  --
                  Das Sein entsteht aus dem Nicht-Sein.
                  http://wwwtech.de/
                  1. hi,

                    Was man so als komplex bezeichnet -- /a(b|c)/ ist was anderes als /ab|c/ :)

                    _braucht_ man denn hier wirklich die runden klammern?
                    was spricht gegen eine zeichenklasse?

                    gruß,
                    wahsaga

                    --
                    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
                    1. 你好 wahsaga,

                      Was man so als komplex bezeichnet -- /a(b|c)/ ist was anderes als
                      /ab|c/ :)

                      _braucht_ man denn hier wirklich die runden klammern?
                      was spricht gegen eine zeichenklasse?

                      1. beim zweiten Beispiel kann man keine Zeichenklasse verwenden, /ab|c/ ist
                        “ab oder c” (waehrend /a(b|c)/ “a gefolgt von b oder c” ist).
                      2. Sei doch bitte nicht so phantasielos ;-) Mach halt das draus:
                        /abc(de|fg)/ bzw. /abcde|fg/. Das erste bedeutet “abc gefolgt von de oder
                        fg”, das zweite bedeutet “abcde oder fg”.

                      再见,
                       CK

                      --
                      Wenn auf Erden alle das Schoene als schoen erkennen, so ist dadurch schon das Haessliche bestimmt.
                      http://wwwtech.de/
                      1. hi,

                        1. beim zweiten Beispiel kann man keine Zeichenklasse verwenden, /ab|c/ ist
                          “ab oder c” (waehrend /a(b|c)/ “a gefolgt von b oder c” ist).

                        da sind beim zweiten beispiel ja auch keine runden klammern drin ...

                        also, worauf ich hinaus wollte:
                        besitzt /a(b|c)/ in deinen augen einen unterschied zu /a[b|c]/
                        (von dem, dass zweiteres keine backreference erzeugt, mal abgesehen ...)

                        btw, verstehen wir unter zeichenklasse hier eigentlich das gleiche?
                        ich meine eben eine durch [ ] eingegrenzte anzahl von zeichen.

                        gruß,
                        wahsaga

                        --
                        "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
                        1. 你好 wahsaga,

                          1. beim zweiten Beispiel kann man keine Zeichenklasse verwenden,
                            /ab|c/ ist “ab oder c” (waehrend /a(b|c)/ “a gefolgt von b oder c” ist).

                          da sind beim zweiten beispiel ja auch keine runden klammern drin ...

                          Ja, eben, darum gehts doch :)

                          also, worauf ich hinaus wollte:
                          besitzt /a(b|c)/ in deinen augen einen unterschied zu /a[b|c]/
                          (von dem, dass zweiteres keine backreference erzeugt, mal abgesehen ...)

                          Oh ja, einen recht grossen. Das zweite ist “a gefolgt von entweder b, oder
                          |, oder c” Aber wenn du fragst, ob /a(b|c)/ einen Unterschied macht zu
                          /a[bc]/: nee, nicht wenn du in a, b und c nur die Zeichen a, b und c
                          siehst. Ich dachte bei dem einfachen Beispiel eher an Platzhalter fuer
                          beliebige Sub-Ausdruecke... aber ejal.

                          btw, verstehen wir unter zeichenklasse hier eigentlich das gleiche?
                          ich meine eben eine durch [ ] eingegrenzte anzahl von zeichen.

                          Jupp. Eine Zeichenklasse halt :)

                          再见,
                           CK

                          --
                          Death is God's way of telling you not to be such a wise guy.
                          http://wwwtech.de/
  2. Hallo Andy,

    if (preg_match("/[(user)(menu)(cart)]/",$PHP_SELF)) { ... }

    damit trifft der Ausdruck zu, wenn eines der Zeichen »acemnrstu()« in $PHP_SELF vorkommt (btw: warum nicht $_SERVER['PHP_SELF']?).

    ob sich der User auf einer Seite "user", "menu", "cart" befindet, oder nicht.

    dann brauchst du als Ausdruck eher sowas wie (ungetestet):
      /(user|menu|cart)/

    • das Findet dir »user« oder »menu« oder »cart«.

    habe ich 3 Teilausdrücke,
    die von eckigen ODER Klammern umrahmt sind.

    die ecken Klammern bewirken kein »oder« sondern definieren eine Zeichenklasse.

    P.s.: Kann ich das auch mit strpos() oder irgendwas schnellerem
    als preg_match() realisieren?

    ja, etwa so: (ungetestet)
      if(strpos($_SERVER['PHP_SELF'],'user') !== false){
        echo 'user';
      }
    (das was in if() steht natürlich mehrmals mit »or« getrennt) ich weiß aber nicht, ab wievielen strpos() sich eine regulärer Ausdruck rentiert.

    Grüße aus Nürnberg
    Tobias

    1. Hi Tobias;
      Danke, mit | läufts gut ...
      Andy

    2. Hallo du da draußen,

      if(strpos($_SERVER['PHP_SELF'],'user') !== false){
          echo 'user';
        }

      Wobei man hier das „!== false“ auch weglassen und einfach
      if(!strpos($_SERVER['PHP_SELF'], 'user'))
           echo 'user';

      schreiben könnte, da ja für strpos in diesem Falle nicht 0 herauskommen kann, weil PHP_SELF wohl immer mit ‚/‘ anfängt. Nur so am Rande.

      PS: Warum werden hier eigentlich Tabulatoren nur als einfache Leerzeichen angezeigt?

      Grüße von hier drinnen, aus Biberach an der Riss,
      Candid Dauth (Dogfish)

      --
      »Bismarck biss Mark, bis Mark Bismarck biss!«
      http://cdauth.net.tc/
      ie:{ fl:( br: va:} ls:[ fo:| rl:( n4:( ss:) de:> js:( ch:| sh:( mo:) zu:|
      1. 你好 Candid,

        PS: Warum werden hier eigentlich Tabulatoren nur als einfache Leerzeichen
        angezeigt?

        Weil Browser _immer_ Tabulatoren als einzelnes Leerzeichen anzeigen?

        再见,
         CK

        --
        Fatal! Ich kann kein Reserve-Offizier mehr sein!
        http://wwwtech.de/
        1. Hallo du da draußen,

          PS: Warum werden hier eigentlich Tabulatoren nur als einfache Leerzeichen
          angezeigt?
          Weil Browser _immer_ Tabulatoren als einzelnes Leerzeichen anzeigen?

          Jep, ist mir klar. Aber man könnte das doch irgendwie so implementieren, dass Tabulatoren eben über non-breaking spaces ‚emuliert‘ werden. Da man ja schon eine monospace-Schriftart hat, könnte man ja die Anzahl der Zeichen, die vor einem solchen Tabulator stehen, zählen, und daraus berechnen, wieviele Leerzeichen hinmüssten. Damit die Einrückung stimmt.

          Grüße von hier drinnen, aus Biberach an der Riss,
          Candid Dauth (Dogfish)

          --
          »Bismarck biss Mark, bis Mark Bismarck biss!«
          http://cdauth.net.tc/
          ie:{ fl:( br: va:} ls:[ fo:| rl:( n4:( ss:) de:> js:( ch:| sh:( mo:) zu:|
          1. Moin!

            Jep, ist mir klar. Aber man könnte das doch irgendwie so implementieren, dass Tabulatoren eben über non-breaking spaces ‚emuliert‘ werden.

            Wenn du uns verraten kannst, wieviele Leerzeichen denn ein Tabulator sind. Das letzte Mal, als ich geschaut habe, war diese Zahl jedenfalls nicht festgelegt.

            - Sven Rautenberg

            1. Hallo du da draußen,

              Wenn du uns verraten kannst, wieviele Leerzeichen denn ein Tabulator sind. Das letzte Mal, als ich geschaut habe, war diese Zahl jedenfalls nicht festgelegt.

              Legen wir sie halt fest… ;-)

              Ich glaube, dass die Länge von acht Leerzeichen am gebräuchlichsten ist. Aber das würde natürlich tatsächlich problematisch, wenn das auf jedem System anders wäre…

              Grüße von hier drinnen, aus Biberach an der Riss,
              Candid Dauth (Dogfish)

              --
              »Bismarck biss Mark, bis Mark Bismarck biss!«
              http://cdauth.net.tc/
              ie:{ fl:( br: va:} ls:[ fo:| rl:( n4:( ss:) de:> js:( ch:| sh:( mo:) zu:|