Reguläre Ausdrücke mit preg ...
Andy
- php
0 Cheatah0 Danke ...
Andy
0 Tobias Kloth
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?
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
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
Hi,
if (preg_match("/(user|_menu|cart)/",$PHP_SELF)) { ... }
hast Du die Klammern bewusst gesetzt, oder aus Gewohnheit?
Cheatah
Hi Cheatah
aus Gewohnheit
weil ich noch PHP-Newbie bin und dachte: "Schad' ja nix ..."
Aber es scheint auch ohne zugehen ... *wunder*
LG, Andy
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
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
你好 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
你好 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
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
你好 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
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
你好 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?
再见,
CK
hi,
- 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
你好 wahsaga,
- 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
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)/
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
Hi Tobias;
Danke, mit | läufts gut ...
Andy
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)
你好 Candid,
PS: Warum werden hier eigentlich Tabulatoren nur als einfache Leerzeichen
angezeigt?
Weil Browser _immer_ Tabulatoren als einzelnes Leerzeichen anzeigen?
再见,
CK
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)
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
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)