Pregunta

Tengo una cadena que tiene HTML & amp; PHP en él, cuando saco la cadena de la base de datos, se repite en la pantalla, pero el código PHP no se muestra. La cadena se ve así:

   $string = 'Hello <?php echo 'World';?>';
   echo $string;

Salida

   Hello

Código fuente

   Hello <?php echo 'World';?>

Cuando miro el código fuente, puedo ver la línea php allí. Entonces, lo que necesito hacer es evaluar () solo el segmento php que está en la cadena.

Una cosa a tener en cuenta es que el PHP podría ubicarse en cualquier parte de la cadena en cualquier momento.

* Solo para aclarar, mi configuración de PHP es correcta, este es un caso de que algunos PHP se descarguen de la base de datos y no se procesen, porque estoy haciendo eco de una variable con el código PHP en ella, falla correr. *

Gracias de nuevo por cualquier ayuda que pueda recibir.

¿Fue útil?

Solución

$str = "Hello
<?php echo 'World';?>";

$matches = array();

preg_match('/<\?php (.+) \?>/x', $str, $matches);

eval($matches[1]);

Esto funcionará, pero como otros han sugerido y sugerirán, esta es una idea terrible. La arquitectura de su aplicación nunca debe girar en torno al almacenamiento de código en la base de datos.

Más simplemente, si tiene páginas que siempre necesitan mostrar cadenas, almacene esas cadenas en la base de datos, no el código para producirlas. Los datos del mundo real son más complicados que esto, pero siempre deben modelarse correctamente en la base de datos.

Editar: necesitaría adaptarse con preg_replace_callback para eliminar la fuente / interpolar correctamente.

Otros consejos

No debes evaluar el código php, solo ejecútalo. Es necesario tener instalado el intérprete php y apache + php configurado correctamente. Entonces este archivo .php debería mostrar Hello World.

Respuesta a la edición: Use preg_replace_callback para obtener la parte php, evalúela, reemplace la entrada a la salida y luego repítala. Pero. Si debe evaluar las cosas provienen de la base de datos, estoy casi seguro, es un error de diseño.

eval () debería funcionar bien, siempre que el código sea PHP apropiado y termine con un punto y coma. ¿Qué tal si primero quitas la etiqueta php y luego la evalúas?

El siguiente ejemplo fue probado y funciona:

<?php
$db_result = "<?php echo 'World';?>";
$stripped_code = str_replace('?>', '', str_replace('<?php', '', $db_result));
eval($stripped_code);
?>

Solo asegúrate de que todo lo que recuperes de la base de datos se haya desinfectado correctamente primero, ya que básicamente estás permitiendo que cualquiera que pueda obtener contenido en la base de datos ejecute el código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top