kostenloser Webspace werbefrei: lima-city


Regex Pattern richtig escapen ?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    lukepress

    lukepress hat kostenlosen Webspace.

    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,


  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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
  4. Autor dieses Themas

    lukepress

    lukepress hat kostenlosen Webspace.

    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 ?!
    ?!?
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    lukepress schrieb:
    heisst das, ohne das + (plus) Zeichen würde nur ein einziges Zeichen (je $haystack) gefunden ?
    Ja, wenn du das + weg lässt wird nur ein Zeichen gefunden, das auf
    [a-z-]
    passt.

    lukepress schrieb:
    ein regex mit 0 quantifier macht doch gar keien Sinn ?!
    Wenn der Ausdruck zwar vorkommen kann, aber nicht vorkommen muss.
  6. 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
  7. Autor dieses Themas

    lukepress

    lukepress hat kostenlosen Webspace.

    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
  8. 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
  9. 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]

  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!