preg_replace shim con soporte eval
Esto es muy desaconsejable. Pero si no es un programador, o realmente prefiere un código terrible, puede usar una preg_replace
función sustituta para mantener su /e
bandera funcionando temporalmente .
function preg_replace_eval($pattern, $replacement, $subject, $limit=-1) {
$pattern = preg_replace('/(\W[a-df-z]*)e([a-df-z]*)$/i', '$1$2', $pattern);
if (preg_match('/\(\.[+*]/', $pattern)) {
trigger_error("preg_replace_eval(): regex contains (.*) or (.+) placeholders, which easily causes security issues for unconstrained/user input in the replacement expression. Transform your code to use preg_replace_callback() with a sane replacement callback!");
}
return preg_replace_callback(
$pattern,
function ($matches) use ($replacement) {
$repl = preg_replace_callback(
'/(?<!\\\\)(?:[$]|\\\\)(\d+)/',
function ($m) use ($matches) {
if (!isset($matches[$m[1]])) { trigger_error("No capture group for '$m[0]' eval placeholder"); }
return addcslashes($matches[$m[1]], '\"\'\`\$\\\0');
},
$replacement
);
return eval("return $repl;");
},
$subject,
$limit
);
}
En esencia, sólo incluye esa función en su código base y editar preg_replace
a preg_replace_eval
dondequiera que el /e
se usó la bandera.
Pros y contras :
- Realmente solo lo probé con algunas muestras de Stack Overflow.
- Solo admite los casos fáciles (llamadas a funciones, no búsquedas de variables).
- Contiene algunas restricciones más y avisos de advertencia.
- Producirá errores dislocados y menos comprensibles por fallas de expresión.
- Sin embargo, sigue siendo una solución temporal utilizable y no complica una transición adecuada a
preg_replace_callback
.
- Y el comentario sobre la licencia solo tiene como objetivo disuadir a las personas de usarlo en exceso o difundirlo demasiado.
Generador de código de reemplazo
Ahora bien, esto es algo redundante. Pero podría ayudar a aquellos usuarios que todavía están abrumados con la reestructuración manual de su código a preg_replace_callback
. Si bien esto lleva más tiempo, un generador de código tiene menos problemas para expandir la /e
cadena de reemplazo en una expresión. Es una conversión sin complicaciones, pero probablemente sea suficiente para los ejemplos más frecuentes.
Para usar esta función, edite cualquier preg_replace
llamada rota preg_replace_eval_replacement
y ejecútela una vez . Esto imprimirá el preg_replace_callback
bloque correspondiente que se utilizará en su lugar.
function preg_replace_eval_replacement($pattern, $replacement, $subjectvar="IGNORED") {
$pattern = preg_replace('/(\W[a-df-z]*)e([a-df-z]*)$/i', '$1$2', $pattern);
$replacement = preg_replace_callback('/[\'\"]?(?<!\\\\)(?:[$]|\\\\)(\d+)[\'\"]?/', function ($m) { return "\$m[{$m[1]}]"; }, $replacement);
$ve = "var_export";
$bt = debug_backtrace(0, 1)[0];
print "<pre><code>
#----------------------------------------------------
# replace preg_*() call in '$bt[file]' line $bt[line] with:
#----------------------------------------------------
\$OUTPUT_VAR = preg_replace_callback(
{$ve($pattern, TRUE)},
function (\$m) {
return {$replacement};
},
\$YOUR_INPUT_VARIABLE_GOES_HERE
)
#----------------------------------------------------
</code></pre>\n";
}
Tenga en cuenta que simplemente copiar y pegar no es programación. Tendrá que adaptar el código generado a sus nombres de variables de entrada / salida reales o al contexto de uso.
- Específicamente, la
$OUTPUT =
asignación debería desaparecer si la preg_replace
llamada anterior se utilizó en un if
.
- Sin embargo, es mejor mantener las variables temporales o la estructura del bloque de código de varias líneas.
Y la expresión de reemplazo puede exigir más mejoras de legibilidad o reelaboración.
- Por ejemplo, a
stripslashes()
menudo se vuelve redundante en expresiones literales.
- Las búsquedas de alcance variable requieren una referencia
use
o global
para / dentro de la devolución de llamada.
- Las
"-$1-$2"
referencias de captura entre comillas desiguales terminarán rotas sintácticamente por la transformación simple en "-$m[1]-$m[2]
.
La salida del código es simplemente un punto de partida. Y sí, esto hubiera sido más útil como herramienta en línea. Este enfoque de reescritura de código (editar, ejecutar, editar, editar) es algo poco práctico. Sin embargo, podría ser más accesible para aquellos que están acostumbrados a la codificación centrada en tareas (más pasos, más descubrimientos). Entonces, esta alternativa podría frenar algunas preguntas más duplicadas.