[PHP] preg_replace wildcard erklärung

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Chieftrain, 17. November 2010 .

  1. 17. November 2010
    preg_replace wildcard erklärung

    Hello again =D

    Hab Gestern versucht mich über die Möglichkeit zu informieren Wildcards in preg_replace zu benutzen.

    Möchte im Grunde einfach nur jedes console.log(*) raushauen. Leider habe ich, auch auf der preg_replace seite auf php.net nichts gefunden (was mich wundert, die doku von php is eig. sehr gut!). Könnt ihr mir da helfen? Ich hab zwar einige Beispiele gefunden, die spezifische Beispiele behandeln, da blicke ich aber überhaupt nicht durch...

    Hoffe ihr könnt mir, mal wieder, helfen =)

    viele grüße (und danke schonmal),
    chiefie
     
  2. 17. November 2010
    AW: preg_replace wildcard erklärung

    das ist ein wenig komplexer als du dir vostellst. ne einfache wildcard reicht in den meisten fällen nicht aus, denn du musst dort ganze ausdrücke auswerten.

    ich bau dir mal nen regex, kann ein wenig dauern. ich editiers dann hier rein
     
  3. 17. November 2010
    AW: preg_replace wildcard erklärung

    Hey vielen Dank!

    Woher hast du denn das Wissen, wie man diesen "regex" baut? Gibts da irgende ne Doku, die man sich mal zu gemüte führen könnte?
     
  4. 17. November 2010
    AW: preg_replace wildcard erklärung

    ist doch ein wenig länger geworden, sollte aber funktionieren:

    PHP:
    <? php

    // in $str die datei einlesen
    $str  'alert(1234); console.log("hallo welt"); alert(1); console.log(console.log("foo\"")); alert("huhu");' ;
    $tokens  preg_split ( '~(console\.log)~' $str , - 1 PREG_SPLIT_DELIM_CAPTURE );

    $open_paren  0 ;

    $src  '' ;
    while((
    $token  array_shift ( $tokens )) !==  null )
        
    $src  .=  parse_toplevel_token ( $token );
     
    $src  cleanup_source ( $src );

    print 
    $src // $src sollte kein console.log() mehr beinhalten
     
    // ------

    function  cleanup_source ( $src ) {
        return 
    preg_replace ( '~void\(0\);(?:void\(0\\))+;~' 'void(0);' $src );
    }

    function 
    parse_toplevel_token ( $token ) {
        if(
    $token  !=  'console.log' )
            return 
    $token ;
            
        return 
    'void(0);'  skip_console_log ();
    }

    function 
    skip_console_log () {
        global 
    $tokens $open_paren ;
        
        
    $next  array_shift ( $tokens );
        
    $rhs   '' ;
        
        for(
    $i  0 $l  strlen ( $next );  $i  $l ; ++ $i ) {
            
    $chr  $next [ $i ];
            
            if(
    in_array ( $chr , array( '"' "'" '/' ))) {
                
    $i  skip_string_or_regex ( $i  1 $chr $next ) -  1 ;
                continue;
            }
            
            if(
    $chr  ==  '(' )
                ++
    $open_paren ;
            elseif(
    $chr  ==  ')' )
                --
    $open_paren ;
            elseif(
    in_array ( $chr , array( '}' ';' )) &&  $open_paren  ===  0 ) {
                
    $rhs  substr ( $next $i  1 );
                break;
            }
        }
        
        if(
    $open_paren  ===  0 )
            return 
    $rhs ;
        
        
    $next  array_shift ( $tokens );
        if(
    $next  ==  'console.log' ) {
            return 
    $rhs  skip_console_log ();
        }
            
        
    array_unshift ( $tokens $next );
    }

    function 
    skip_string_or_regex ( $offset $delim $token ) {
        
    $len  strlen ( $token );
        while(
    $offset  $len ) {
            if(
    $token [ $offset ] ==  '\\' ) {
                
    $offset  +=  2 ;
                continue;
            }
            
            if(
    $token [ $offset ] ==  $delim ) {
                ++
    $offset ;
                break;
            }
            
            ++
    $offset ;
        }
        
        return 
    $offset ;
    }

     
  5. 17. November 2010
    AW: preg_replace wildcard erklärung

    Das ja kompliziert Oo

    Vielen Dank! Klappt alles wunderbar

    Hoffe ich kann dir in der nächsten Zeit auch mal so ne große Hilfe sein.... =D
     
  6. 3. Dezember 2010
    AW: preg_replace wildcard erklärung

    Hey Murdoc,

    ne kleine Verständnissfrage zu deinem Skript, dass du mir ja freundlicherweise geschrieben hast.

    Ein Kollege von mir meinte, dass man diese Skript auch viel einfacher hätte schreiben können, indem man einfach nurconsole.log(".?"); console.log('.?'); ggf. noch console.log\b(".?");console.log\b('.?'); als Regex-Ausdruck in preg_replace verwendet hätte. Warum ist dein Skript so lang geworden? Es läuft tadellos, keine Frage, dennoch möchte ich dein Skript komplett verstehen, was mir leider bisher nicht wirklich gelungen ist ^^

    Hab das Thema mal wieder geöffnet, vielleicht interessiert das ja auch andere, mit der selben Problematik.
     
  7. 3. Dezember 2010
    AW: preg_replace wildcard erklärung

    das hat nen einfachen grund, undzwar arbeite ich mit dem script alle möglichen ausdrücke innerhalb der klammern ab.

    ".?" oder '.?' passt zb. nicht mehr auf "asdf\"" oder 'asdf\'' bzw. passt schon, lässt aber den teil nach \ stehen was am ende zu einem syntax-error führt. der nächste grund sind echte ausdrücke wie z.b. "hallo".welt() oder (function() { return "asdf"; })() - solche sachen kannst du mit einem einfachen reg-exp nicht finden.

    und warum ich die fundstellen nicht entferne sondern mit void(0) ersetze hat auch nen grund, undzwar schleifen ohne code-block würden ohne einen direkt folgenden ausdruck nicht mehr funktionieren:

    Code:
    for(var i = 0; i < 10; ++i)
     console.log("asdf");
    
    alert("fertig");
    ohne void(0); würde das dann so aussehen:

    Code:
    for(var i = 0; i < 10; ++i)
    
    alert("fertig");
    d.h.: das script würde 10x "fertig" ausgeben.

    mit void(0):

    Code:
    for(var i = 0; i < 10; ++i)
     void(0);
    
    alert("fertig");
    10x nichts machen. wobei in diesem fall ein einfaches ";" auch gereicht hätte.

    -----

    klar hätte man das ganze speziell für deine bedürfnisse ggf. auch mit einem regulären ausdruck lösen können, aber man steckt halt nicht drin - zumindest hast du keinen code gezeigt.

    frag doch mal einen deiner leute, wie man mit einem einzigen regexp folgendes hätte ersetzen können:
    Code:
    console.log("höhe: " + (function() {
     return this.setStyle(
     Object.extend(default_style, {
     height: "100px",
     width: "200px"
     })
     ).getHeight();
    }).call(element).toString());
    rein aus neugier, vielleicht kann ich ja noch was lernen.
     
  8. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.