En PHP, ¿por qué </script> no muestra un error de análisis?

193

Estaba ejecutando el siguiente código PHP :

<?php 
    </script>
?>

No hubo errores de análisis y el resultado fue " ?>" ( ejemplo ).

En casos similares recibo un error de análisis:

<?php 
    </div>
?>

Error de análisis: error de sintaxis, '<' inesperado en ...

¿Por qué no <?php </script> ?>da el mismo error?

Irfan
fuente
Sólo curioso. ¿Qué estaban tratando de lograr o en qué estaban experimentando?
asprin
8
En realidad, el caso fue diferente anoche, perdí la etiqueta de cierre de php. Y después de esto tuve una etiqueta </script> y pasé más de 30 minutos para descubrir por qué esto no tiene ningún error, pero aún así la salida no es tan deseada .
Irfan
77
Ya no quiero vivir en este planeta.
Kzqai
2
PHP hace eso a las personas.
xiankai

Respuestas:

273

Esto debe ser porque hay varias formas de iniciar un bloque de código PHP :

  • <? ... ?>(conocido como short_open_tag)

  • <?php ... ?> (el estándar realmente)

  • <script language="php"> ... </script> (no recomendado)

  • <% ... %> (etiqueta de estilo ASP obsoleta y eliminada después de 5.3.0)

Aparentemente, puede abrir un bloque PHP de una manera y cerrarlo de la otra. No lo sabia.

Entonces, en su código, abrió el bloque usando <?pero PHP reconoce </script>como el cerrador. Lo que paso fue:

<?php       <----- START PHP
</script>   <----- END PHP
?>          <----- JUST GARBAGE IN THE HTML
Pekka
fuente
31
Tenga en cuenta que <script language="php">no se recomienda su uso.
John Dvorak el
44
Nota rápida, porque recordé que hubo algún cambio con la short_open_tagdirectiva. En PHP 5.4 <?=corto para <?php echoya no requiere el short_open_tag. Ir entre sistemas donde <?=estaba disponible y no disponible siempre me frustraba. php.net/manual/en/ini.core.php#ini.short-open-tag
Chris
1
@thatmiddleway Tenga en cuenta que el documento oficial también recomienda <?php ... ?>: php.net/manual/en/language.basic-syntax.phpmode.php
John Dvorak
37

En PHP, puede usar la scriptetiqueta para abrir un bloque PHP.

Entonces puedes usar

<script language="php">
    echo 'hello world';
</script>

Así que en su ejemplo que haya mezclado la etiqueta abierta normal, <?phpcon la etiqueta de cierre, </script>. Por lo tanto, el analizador supone que todo el texto después de la etiqueta del script de cierre es normal HTML.

Lea más en Escaping from HTML .

amd
fuente