En PHP, pourquoi </script> n'affiche-t-il pas une erreur d'analyse?

193

J'exécutais le code PHP suivant:

<?php 
    </script>
?>

Il n'y a eu aucune erreur d'analyse et la sortie était " ?>" ( exemple ).

Dans des cas similaires, j'obtiens une erreur d'analyse:

<?php 
    </div>
?>

Erreur d'analyse: erreur de syntaxe, '<' inattendu dans ...

Pourquoi ne <?php </script> ?>donne- t-il pas la même erreur?

Irfan
la source
Juste curieux. Qu'est-ce que vous tentiez de réaliser ou qu'est-ce que vous expérimentiez?
asprin
8
En fait, le cas était différent hier soir, j'ai raté la balise de fermeture php.Et après cela, j'ai eu une balise </script> et j'ai passé plus de 30 minutes à comprendre pourquoi cela n'a pas d'erreur mais la sortie n'est pas aussi désirable .
Irfan
7
Je ne veux plus vivre sur cette planète.
Kzqai
2
PHP fait ça aux gens.
xiankai

Réponses:

273

Cela doit être dû au fait qu'il existe différentes façons de démarrer un bloc de code PHP :

  • <? ... ?>(dit short_open_tag)

  • <?php ... ?> (la norme vraiment)

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

  • <% ... %> (balise de style ASP obsolète et supprimée après 5.3.0)

Apparemment, vous pouvez ouvrir un bloc PHP dans un sens et le fermer dans l'autre. Je ne le savais pas.

Donc, dans votre code, vous avez ouvert le bloc en utilisant <?mais PHP reconnaît </script>comme le plus proche. Ce qui s'est passé était:

<?php       <----- START PHP
</script>   <----- END PHP
?>          <----- JUST GARBAGE IN THE HTML
Pekka
la source
31
Notez que l'utilisation <script language="php">n'est pas recommandée.
John Dvorak
4
Petite note, car je me suis souvenu qu'il y avait eu des changements avec la short_open_tagdirective. En PHP 5.4 <?=court pour <?php echone nécessite plus le short_open_tag. Passer d'un système à un autre <?=disponible ou non disponible m'a toujours frustré. php.net/manual/en/ini.core.php#ini.short-open-tag
Chris
1
@thatmiddleway Notez que le document officiel recommande <?php ... ?>également: php.net/manual/en/language.basic-syntax.phpmode.php
John Dvorak
37

En PHP, vous pouvez utiliser la scriptbalise pour ouvrir un bloc PHP.

Vous pouvez donc utiliser

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

Donc , dans votre exemple , vous avez mélangé l'étiquette ouverte normale, <?phpavec la balise de fermeture, </script>. L'analyseur suppose donc que tout le texte après la balise de script de fermeture est normal HTML.

Pour en savoir plus, échapper au HTML .

amd
la source