with str_replace regular preg_replace_callback preg_replace php regex preg-replace preg-replace-callback

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 de addslashes() internamente en los argumentos, por lo que algunos reemplazos utilizaron stripslashes() para eliminarlo; en la mayoría de los casos, es probable que desee eliminar la llamada a stripslashes 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?