In PHP, perché </script> non mostra un errore di analisi?


193

Stavo eseguendo il seguente codice PHP :

<?php 
    </script>
?>

Non ci sono stati errori di analisi e l' output era " ?>" ( esempio ).

In casi simili ottengo un errore di analisi:

<?php 
    </div>
?>

Errore di analisi: errore di sintassi, inatteso "<" in ...

Perché non <?php </script> ?>dà lo stesso errore?


Solo curioso. Cosa stavi cercando di ottenere o su cosa stavi sperimentando?
asprin,

8
In realtà il caso è stato diverso la scorsa notte, ho perso il tag di chiusura di php e dopo questo ho avuto un tag </script> e ho trascorso più di 30 minuti per capire perché questo non ha alcun errore ma l'output non è ancora il desiderio .
Irfan,

7
Non voglio più vivere su questo pianeta.
Kzqai,

2
PHP lo fa alle persone.
xiankai,

Risposte:


273

Questo perché ci sono vari modi per avviare un blocco di codice PHP :

  • <? ... ?>(noto come short_open_tag)

  • <?php ... ?> (lo standard davvero)

  • <script language="php"> ... </script> (non consigliato)

  • <% ... %> (tag obsoleto e rimosso in stile ASP dopo 5.3.0)

Apparentemente, puoi aprire un blocco PHP in un modo e chiuderlo nell'altro. Non lo sapevo.

Quindi nel tuo codice hai aperto il blocco usando <?ma PHP riconosce </script>come il più vicino. Quello che è successo è stato:

<?php       <----- START PHP
</script>   <----- END PHP
?>          <----- JUST GARBAGE IN THE HTML

31
Si noti che l'uso <script language="php">non è raccomandato.
John Dvorak,

4
Nota veloce, perché mi sono ricordato che c'era qualche cambiamento con la short_open_tagdirettiva. In PHP 5.4 in <?=breve <?php echonon richiede più il short_open_tag. Andare tra i sistemi in cui <?=era disponibile e non disponibile mi ha sempre frustrato. php.net/manual/en/ini.core.php#ini.short-open-tag
Chris

1
@thatmiddleway Nota che anche il documento ufficiale raccomanda <?php ... ?>: php.net/manual/en/language.basic-syntax.phpmode.php
John Dvorak,

37

In PHP, puoi usare il scripttag per aprire un blocco PHP.

Quindi puoi usare

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

Quindi nel tuo esempio aver mescolato il normale tag di apertura, <?phpcon il tag di chiusura, </script>. Quindi il parser presume che tutto il testo dopo il tag di script di chiusura sia normale HTML.

Maggiori informazioni in Escaping from HTML .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.