str_replace - preg_replace_callback php
Reemplazar el modificador preg_replace() e con preg_replace_callback (1)
En una expresión regular, puede "capturar" partes de la cadena combinada con (brackets)
; en este caso, está capturando las partes (^|_)
y ([az])
del partido. Estos están numerados comenzando en 1, por lo que tiene referencias retros 1 y 2. La coincidencia 0 es la cadena completa.
El modificador /e
toma una cadena de reemplazo, y sustituye la barra invertida seguida de un número (por ejemplo, /1
) con la referencia posterior apropiada, pero debido a que está dentro de una cadena, necesita escapar de la barra invertida, por lo que obtiene ''//1''
. A continuación, ejecuta (efectivamente) eval
para ejecutar la cadena resultante como si fuera código PHP (razón por la cual está en desuso, porque es fácil usar eval
de una manera insegura).
La función preg_replace_callback
toma una función de devolución de llamada y le pasa una matriz que contiene las referencias secundarias coincidentes. Entonces, donde habría escrito ''//1''
, en su lugar accederá al elemento 1 de ese parámetro; por ejemplo, si tiene una función anónima de la función de formulario function($matches) { ... }
, la primera referencia inversa es $matches[1]
dentro de esa función.
Así que un argumento /e
de
''do_stuff(//1) . "and" . do_stuff(//2)''
podría convertirse en una devolución de llamada de
function($m) { return do_stuff($m[1]) . "and" . do_stuff($m[2]); }
O en tu caso
''strtoupper("//2")''
podría convertirse
function($m) { return strtoupper($m[2]); }
Tenga en cuenta que $m
$matches
no son nombres mágicos, son solo el nombre del parámetro que di al declarar mis funciones de devolución de llamada. Además, no tiene que pasar una función anónima, podría ser un nombre de función como una cadena, o algo de la array($object, $method)
formulario array($object, $method)
, como con cualquier devolución de llamada en PHP , por ejemplo
function stuffy_callback($things) {
return do_stuff($things[1]) . "and" . do_stuff($things[2]);
}
$foo = preg_replace_callback(''/([a-z]+) and ([a-z]+)/'', ''stuffy_callback'', ''fish and chips'');
Como con cualquier función, no puede acceder a las variables fuera de su devolución de llamada (desde el ámbito circundante) de forma predeterminada. Al usar una función anónima, puede usar la palabra clave use
para importar las variables a las que necesita acceder, como se explica en el manual de PHP . por ejemplo, si el viejo argumento era
''do_stuff(//1, $foo)''
entonces la nueva devolución de llamada podría verse como
function($m) use ($foo) { return do_stuff($m[1], $foo); }
Gotchas
- El uso de
preg_replace_callback
es en lugar del modificador/e
en la expresión regular, por lo que debe quitar esa marca de su argumento "patrón". Entonces, un patrón como/blah(.*)blah/mei
/blah(.*)blah/mi
.*)/blah(.*)blah/mi
/blah(.*)blah/mei
se convertiría en/blah(.*)blah/mi
. - El modificador
/e
utilizó una variante deaddslashes()
internamente en los argumentos, por lo que algunos reemplazos utilizaronstripslashes()
para eliminarlo; en la mayoría de los casos, es probable que desee eliminar la llamada astripslashes
de su nueva devolución de llamada.
Soy terrible con expresiones regulares. Estoy tratando de reemplazar esto:
public static function camelize($word) {
return preg_replace(''/(^|_)([a-z])/e'', ''strtoupper("//2")'', $word);
}
con preg_replace_callback con una función anónima. No entiendo lo que está haciendo el // 2. O para el caso exactamente cómo funciona preg_replace_callback.
¿Cuál sería el código correcto para lograr esto?