No PHP, por que </script> não mostra um erro de análise?

193

Eu estava executando o seguinte código PHP :

<?php 
    </script>
?>

Não houve erros de análise e a saída foi " ?>" ( exemplo ).

Em casos semelhantes, recebo um erro de análise:

<?php 
    </div>
?>

Erro de análise: erro de sintaxe, inesperado '<' em ...

Por que não <?php </script> ?>dá o mesmo erro?

Irfan
fonte
Apenas curioso. O que você estava tentando alcançar ou o que você estava experimentando?
Asprin
8
Na verdade, o caso foi diferente ontem à noite, perdi a tag de fechamento do php. Depois disso, tive uma tag </script> e passei mais de 30 minutos para descobrir por que isso não tem nenhum erro, mas ainda assim a saída não é o desejo .
Irfan
7
Não quero mais viver neste planeta.
Kzqai
2
PHP faz isso com as pessoas.
xiankai 29/09

Respostas:

273

Isso deve ser porque existem várias maneiras de iniciar um bloco de código PHP :

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

  • <?php ... ?> (o padrão realmente)

  • <script language="php"> ... </script> (não recomendado)

  • <% ... %> (marca de estilo ASP descontinuada e removida após 5.3.0)

Aparentemente, você pode abrir um bloco PHP de uma maneira e fechá-la da outra. Não sabia disso.

Então, no seu código, você abriu o bloco usando, <?mas o PHP reconhece </script>como o mais próximo. O que aconteceu foi:

<?php       <----- START PHP
</script>   <----- END PHP
?>          <----- JUST GARBAGE IN THE HTML
Pekka
fonte
31
Observe que o uso <script language="php">não é recomendado.
John Dvorak
4
Nota rápida, porque lembrei que havia alguma alteração na short_open_tagdiretiva. No PHP 5.4, a <?=abreviação de <?php echonão requer mais o short_open_tag. Indo entre sistemas onde <?=estava disponível e não disponível sempre me frustrou. php.net/manual/en/ini.core.php#ini.short-open-tag
Chris
1
@thatmiddleway Observe que o documento oficial também recomenda <?php ... ?>: php.net/manual/en/language.basic-syntax.phpmode.php
John Dvorak
37

No PHP, você pode usar a scripttag para abrir um bloco PHP.

Então você pode usar

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

Portanto, no seu exemplo, você misturou a marca aberta normal,, <?phpcom a marca de fechamento </script>,. Portanto, o analisador assume que todo o texto após a tag de script de fechamento é normalHTML .

Leia mais em Escapando do HTML .

amd
fonte