Regex Pattern richtig escapen ?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
attribut
ausdruck
code
frage
fuchsen
gruppe
http
liste
machen
match
minuszeichen
null
sinn
string
treffer
url
vorherige ausdruck
vorkommen
zeichen
zeile
-
Hallo
eine Frage (zum Verständnis), wie man einen Pattern (regex) richtig escapen muss
REGEX: nur alphanumerische Zeichen plus einige bestimmte Sonderzeichen zulassen
also so Extra-Zeichen wie zum Beispiel + (Plus), - (Minus), _ (Unterstrich), ....
bei folgenden Beispielen davon ausgehen:$string = strtolower($string);
Beispiel:
nur 0 bis 9 und a bis z und äöüß und _ (Unterstrich) und - (Minus) als Zeichen zulassen
alle anderen Zeichen durch '' (Leerstring) ersetzen
// ----- genügt das so ?----- $string = preg_replace('/[^0-9a-zäöüß_-]/','',$string); // ----- oder escapen ? ----- $string = preg_replace('/[^0-9a-zäöüß_\-]/','',$string); // ----- oder nur escapen wenn noch was folgt ? ----- $string = preg_replace('/[^0-9a-zäöüß\-_]/','',$string);
wann muss ich das - (Minus) escapen,
... weil es ja eigentlich eine "Funktion" hat (von ... bis)
Welche Zeichen in REGEX haben eine "Funktion" und müssen wann escaed werden ?!?
... gibt es eine Liste / Übersicht der Funktions-Zeichen in regex pattern ?
sind das alle ? ... http://www.php.net/manual/de/regexp.reference.meta.php
... das Minus-Zeichen ist da garnicht aufgeführt ?!?!
soll in der Liste (siehe Link)
das Zeichen bei "negate the class, but only if the first character" ein _ Unterstrich sein ?
?
Wenn ich eines dieser Zeichen als Extrazeichen (neben a-z0-9äöüß) zulassen will,
mus ich diese dann im regex Pattern jeweils immer escapen ?!?
... oder nur wenn danach noch (mind) ein weiteres Zeichen folgt,
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wenn das Minuszeichen innerhalb einer Gruppe vorkommt, gibt es einen Bereich an. Dieser Bereich fängt mit dem linken Operand an und hört mit dem rechten auf.
Die einzige Ausnahme (wie du bereits angedeutet hast), ist der Fall, wenn das Minus als letztes in der Gruppe notiert wird. Dann wird es einfach wie das Minuszeichen behandelt.
Und möglicherweise zählt das Minus-Zeichen nicht zu den Meta-Zeichen, da es eben nur innerhalb von Gruppen eine besondere Bedeutung haben kann.
<?php $pattern = '/[a-z-]+/'; $matches = array(); $haystacks = array( 'ABC', '123', 'abcD', '-', '-ab-cD' ); foreach( $haystacks as $haystack ) { if( preg_match( $pattern, $haystack, $matches ) ) { echo 'found in ' . $haystack . "\nwith matches: "; foreach( $matches as $match ) { echo $match . ' '; } echo "\n"; } } ?>
Beitrag zuletzt geändert: 3.6.2012 12:45:03 von bladehunter -
ok, Danke
also Minuszeichen nur in Gruppe, und nur escapen, wenn (in Gruppe) weitere Zeichen folgen
noch ne Frage zu Deinem Pattern:
$pattern = '/[a-z-]+/';
was macht das + (Plus) Zeichen nach der Gruppe ?
laut 'Meta-characters' + ---> 0 or more quantifier
heisst das, ohne das + (plus) Zeichen würde nur ein einziges Zeichen (je $haystack) gefunden ?
also bei "0 or more quantifier" frage ich mich:
... Warum 0 (Null)
ein regex mit 0 quantifier macht doch gar keien Sinn ?!
?!?
-
lukepress schrieb:
Ja, wenn du das + weg lässt wird nur ein Zeichen gefunden, das auf
heisst das, ohne das + (plus) Zeichen würde nur ein einziges Zeichen (je $haystack) gefunden ?
passt.[a-z-]
lukepress schrieb:
Wenn der Ausdruck zwar vorkommen kann, aber nicht vorkommen muss.
ein regex mit 0 quantifier macht doch gar keien Sinn ?! -
lukepress schrieb:
was macht das + (Plus) Zeichen nach der Gruppe ?
laut 'Meta-characters' + ---> 0 or more quantifier
Du bist in der Zeile verrutscht.
+ bedeutet: Der vorherige Ausdruck muss mindestens einmal vorkommen
* bedeutet: Der vorherige Ausdruck kann beliebig häufig (auch garnicht) vorkommen. Wenn du beispielsweise an HTML Attribute denkst, so kann ein Tag beliebig viele Attribute haben.
Ansonsten hat hackyourlife bereits alles gesagt.
Beitrag zuletzt geändert: 3.6.2012 15:15:17 von bladehunter -
bladehunter schrieb:
Du bist in der Zeile verrutscht.
ok, alles klar ... :) ... die Zeilen sind da aber auch komisch angeordnet .... naja
.... also * (Sternchen) ist das Meta-Zeichen,
bei dem mich das 0 (Null) in der Doku (bzw. das Wörtchen "garnicht") so verwirrt
* bedeutet: Der vorherige Ausdruck kann beliebig häufig (auch garnicht) vorkommen
... auch garnicht ... ???
für mich klingt das so als ob es auch dann ein Treffer wäre,
auch wenn der Ausdruck "garnicht" im String vorkommt (Null mal)
und würde doch gar keien Sinn machen?
+ ----> 1 or more quantifier .... ok, das macht macht Sinn
* ----> 0 or more quantifier .... 0 (Null) ???? ... Ausdruck kommt garnicht im String vor ?!
$string = 'Mein Name ist Hase'; $pattern = '/fuchs*/i'; if ( preg_match( $pattern, $string, $matches ) ) { print "... ja \n"; } else { print "... nein \n"; }
es kommt (bei mir) dabei "... nein" raus (bzw. FALSE beim preg_match)
Also doch kein Treffer ... ?! ... wie wird sonst dieses Meta-Zeichen * bei regex verwendet ?
was hat dieses "0 or more quantifier" zu bedeuten ?! :oOo
--> ja wohl nicht: Treffer bei Null oder mehr "Zeichen" vom Ausdruck im String ?
mit "quantifier" ist doch die "Anzahl" gemeint, wie oft der Ausdruck im String vorkommt
bei + ... wenn mind. 1 mal vorkommt, OK
bei * ... auch wenn 0 mal .... die "blöde" 0 (Null) :::::oOo::::: ?
... 0 or more quantifie .... was will mit das "Sagen" ?? .
Beitrag zuletzt geändert: 3.6.2012 16:43:27 von lukepress -
Der reguläre Ausdruck
"/fuchs*/"
Sucht nach einer Buchstabenabfolge, die mit "fuch" anfängt und dann mit beliebig vielen "s" endet.
Mögliche Treffer:
fuch fuchs fuchssss
Wenn du ein ganzes Wort in wiederholter Form matchen willst, musst du runde Klammern verwenden.
Beitrag zuletzt geändert: 3.6.2012 17:06:40 von bladehunter -
zum Thema: Regex Pattern richtig escapen
gibt es eine vollständige Liste an Zeichen, die in einem Regex Pattern escaped werden müssen,
wenn man sie als "String" verwenden will ?
ich kenne diese Liste: http://php.net/manual/en/regexp.reference.meta.php
bzw auch hier: http://docs.kde.org/stable/de/kde-baseapps/kate/regex-patterns.html
daraus entnehme ich als Zeichen-Liste:
^ $ . [ ] | ( ) ? * + { } \ -
sind das alle ? ... was ist mit Ausrufezeichen ! oder Raute # ... etc.
--> vollständige Liste an (Steuer-) Zeichen für Regex Pattern ?
... ohne Abkürzungen wie \w für [a-zA-Z0-9] ... oder \s für [ \t\n\r]
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage