Sostituisci preg_replace () e modificatore con preg_replace_callback

Sono terribile con espressioni regolari. Sto provando a sostituire questo:

public static function camelize($word) { return preg_replace('/(^|_)([az])/e', 'strtoupper("\\2")', $word); } 

con preg_replace_callback con una function anonima. Non capisco cosa stia facendo \\ 2. O per quanto riguarda esattamente come preg_replace_callback funziona.

Quale sarebbe il codice corretto per raggiungere questo?

In un'espressione regolare, è ansible "catturare" parti della string con (brackets) ; in questo caso, stai catturando le parti (^|_) e ([az]) della partita. Questi sono numerati a partire da 1, quindi hai i riferimenti di return 1 e 2. La corrispondenza 0 è l'intera string con corrispondenza.

Il modificatore /e prende una string sostitutiva e sostituisce la barra rovesciata seguita da un numero (ad esempio \1 ) con il riferimento all'indietro appropriato – ma poiché ci si trova all'interno di una string, è necessario sfuggire alla barra rovesciata, quindi si ottiene '\\1' . Quindi esegue (efficacemente) eval per eseguire la string risultante come se fosse codice PHP (motivo per cui è deprecato, perché è facile usare eval in modo non sicuro).

La function preg_replace_callback accetta invece una function di callback e le passa una matrix contenente i riferimenti di return corrispondenti. Quindi, where avresti scritto '\\1' , hai invece accesso all'elemento 1 di quel parametro – ad esempio se hai una function anonima della function form function($matches) { ... } , il primo riferimento all'indietro è $matches[1] all'interno di quella function.

Quindi un argomento di /e di

 'do_stuff(\\1) . "and" . do_stuff(\\2)' 

potrebbe diventare una richiamata di

 function($m) { return do_stuff($m[1]) . "and" . do_stuff($m[2]); } 

O nel tuo caso

 'strtoupper("\\2")' 

potrebbe diventare

 function($m) { return strtoupper($m[2]); } 

Nota che le corrispondenze $m $matches non sono nomi magici, sono solo il nome del parametro che ho dato quando dichiaro le mie funzioni di callback. Inoltre, non devi passare una function anonima, potrebbe essere un nome di function come una string, o qualcosa arrays($object, $method) form arrays($object, $method) , come con qualsiasi callback in PHP , ad es.

 function stuffy_callback($things) { return do_stuff($things[1]) . "and" . do_stuff($things[2]); } $foo = preg_replace_callback('/([az]+) and ([az]+)/', 'stuffy_callback', 'fish and chips'); 

Come per qualsiasi function, per impostazione predefinita non è ansible accedere a variables esterne al callback (dall'ambito circostante). Quando si utilizza una function anonima, è ansible utilizzare la parola chiave use per importre le variables a cui è necessario accedere, come discusso nel manuale PHP . ad esempio se il vecchio argomento era

 'do_stuff(\\1, $foo)' 

allora potrebbe apparire il nuovo callback

 function($m) use ($foo) { return do_stuff($m[1], $foo); }