2010-07-01 13 views
5

¿Cuál es la mejor manera de eliminar estas etiquetas de una cadena, prepararla para pasarla a eval()?PHP - Quitar <?php ?> etiquetas de una cadena

por ej. La cadena puede ser algo como esto:

<?php 
    echo 'hello world'; 
    ?> 
    Hello Again 
    <?php 

    echo 'Bye'; 
?> 

Obviamente str_replace no funcionará porque las dos etiquetas php en la necesidad media para estar allí (la del primero y el último deben desmontarse)

+1

¿Por qué quieres hacer esto? Huele a una mala idea. – alex

+1

La respuesta es que no usas 'eval'. ;) (Solo el 25% bromea en realidad.) – deceze

+3

Utilicé eval una vez, cachorros murieron, historia real. –

Respuesta

4

Sonidos como una mala idea, pero si quieres los de inicio y fin retirados que podría hacer

$removedPhpWrap = preg_replace('/^<\?php(.*)(\?>)?$/s', '$1', $phpCode); 

Este debería hacerlo (no probado).

Por favor dígame también por qué quiere hacerlo, estoy 95% seguro de que hay una manera mejor.

+0

funciona, gracias: D – Alex

+0

+1 incluso solo para la primera cláusula. –

+1

¿qué pasa con php sin el último '?>'? : P – MysteryDev

4

Normalmente, no le conviene pasar una función a eval. Si desea simplemente eliminar las etiquetas, string_replace haría el trabajo bien, sin embargo, es mejor que utilice una expresión regular.

preg_replace(array('/<(\?|\%)\=?(php)?/', '/(\%|\?)>/'), array('',''), $str);

Esto cubre las etiquetas de edad-ASP, PHP short-tags, etiquetas php echo, y las etiquetas php normales.

+0

Creo que solo quiere que se eliminen las de inicio y finalización, pero puedo estar equivocado. – alex

+0

Sí, no vi eso. Pensé que estaba teniendo problemas con diferentes tipos de etiquetas. – CodeJoust

2

No es necesario utilizar expresiones regulares; PHP proporciona funciones para eliminar caracteres del principio o el final de una cadena. ltrim quita caracteres del comenzando de la cadena, rtrim del final de la cadena y trim en ambos extremos.

$code = trim ($code); 
$code = ltrim($code, '<?php'); 
$code = rtrim($code, '?>'); 

La primera trim() elimina los espacios iniciales o finales que están presentes en el emplazamiento. Si omitimos esto y hubo espacios en blanco fuera de de las etiquetas PHP en la cadena, los comandos ltrim y rtrim no eliminarán las etiquetas PHP.

+1

El problema con esta solución es que las etiquetas '' pueden estar presentes varias veces en el archivo, no solo al principio y al final. De hecho, si miras su muestra, hay dos conjuntos de etiquetas allí. Entonces, la expresión regular es probablemente la solución más viable aquí. –

+0

@ Karl-JohanSjögren Las funciones que he utilizado solo eliminan las etiquetas PHP del principio o el final de la cadena; no solo en cualquier parte de la cadena. Puede leer más sobre estas funciones en los enlaces que he incluido en mi respuesta – shea

+0

Y si lo hace, alguien puede colarse un tercer conjunto de etiquetas en el medio de la cadena y seguir haciendo cosas malas, por lo que esto realmente no es una buena recomendación para el caso Askers. –

0

Se podría hacer:

eval("?> $string_to_be_evald <?"); 

que cerrar las etiquetas implícitas y hacer que todo funcione.