В PHP почему </ script> не показывает ошибку разбора?

193

Я запускал следующий код PHP :

<?php 
    </script>
?>

Не было ошибок разбора, и вывод был " ?>" ( пример ).

В подобных случаях я получаю ошибку разбора:

<?php 
    </div>
?>

Ошибка разбора: синтаксическая ошибка, неожиданное '<' в ...

Почему не <?php </script> ?>выдает ту же ошибку?

Ирфан
источник
Просто любопытно. Чего пытались достичь или над чем вы экспериментировали?
2012 года
8
На самом деле ситуация была другой, прошлой ночью я пропустил закрывающий тег php. И после этого у меня был тег </ script>, и я потратил более 30 минут, чтобы выяснить, почему это не приводит к ошибкам, но вывод не такой желательный ,
Ирфан
7
Я не хочу больше жить на этой планете.
Kzqai
2
PHP делает это с людьми.
Сянкай

Ответы:

273

Это должно быть потому, что есть разные способы запуска блока кода PHP :

  • <? ... ?>(известный как short_open_tag)

  • <?php ... ?> (стандарт действительно)

  • <script language="php"> ... </script> (не рекомендуется)

  • <% ... %> (устарел и удален тег в стиле ASP после 5.3.0)

Очевидно, вы можете открыть блок PHP одним способом, а закрыть его другим способом. Не знал этого.

Таким образом, в вашем коде вы открыли блок, используя, <?но PHP распознает </script>как ближе. Что случилось было:

<?php       <----- START PHP
</script>   <----- END PHP
?>          <----- JUST GARBAGE IN THE HTML
Пекка
источник
31
Обратите внимание, что использование <script language="php">не рекомендуется.
Джон Дворжак
4
Быстрое примечание, потому что я вспомнил, что с short_open_tagдирективой произошли некоторые изменения . В PHP 5.4 <?=сокращений <?php echoбольше не требуется short_open_tag. Переход между системами, где <?=был доступен и не доступен, всегда расстраивал меня. php.net/manual/en/ini.core.php#ini.short-open-tag
Крис
1
@thatmiddleway Обратите внимание, что официальный документ также рекомендует <?php ... ?>: php.net/manual/en/language.basic-syntax.phpmode.php
Джон Дворжак
37

В PHP вы можете использовать scriptтег, чтобы открыть блок PHP.

Так что вы можете использовать

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

Итак, в вашем примере вы смешали обычный открытый тег <?phpс закрывающим тегом </script>. Таким образом, синтаксический анализатор предполагает, что весь текст после закрывающего тега скрипта является нормальным HTML.

Подробнее в Побег из HTML .

драм
источник