PHP Conference Japan 2024

HTML 转义

PHP 解析器会忽略一对开始和结束标签之外的所有内容,这允许 PHP 文件包含混合内容。例如,这允许将 PHP 嵌入到 HTML 文档中以创建模板。

<p>这段内容将被 PHP 忽略,并由浏览器显示。</p>
<?php echo '这段内容将被解析。'; ?>
<p>这段内容也将被 PHP 忽略,并由浏览器显示。</p>
这按预期工作,因为当 PHP 解释器遇到 ?> 结束标签时,它会简单地开始输出它找到的任何内容(除了紧随其后的换行符 - 请参阅 指令分隔符),直到它遇到另一个开始标签,除非在条件语句的中间,在这种情况下,解释器将在决定跳过什么内容之前确定条件的结果。请参见下一个示例。

使用带有条件的结构

示例 #1 使用条件的高级转义

<?php if ($expression == true): ?>
如果表达式为真,则显示此内容。
<?php else: ?>
否则显示此内容。
<?php endif; ?>
在这个例子中,PHP 将跳过条件不满足的代码块,即使它们在 PHP 开/关标签之外;PHP 根据条件跳过它们,因为 PHP 解释器将跳过未满足条件的代码块。

对于输出大块文本,退出 PHP 解析模式通常比通过 echoprint 发送所有文本效率更高。

注意:

如果 PHP 嵌入在 XML 或 XHTML 中,则必须使用标准的 PHP <?php ?> 标签以保持与标准的兼容性。

添加笔记

用户贡献笔记 3 条笔记

quickfur at quickfur dot ath dot cx
14 年前
当文档说明 PHP 解析器忽略 <?php ... ?> 标签之外的所有内容时,这意味着字面上的所有内容,包括您通常不会认为“有效”的内容,例如:

<html><body>
<p<?php if ($highlight): ?> class="highlight"<?php endif;?>>这是一个段落。</p>
</body></html>

请注意 PHP 代码是如何嵌入到 HTML 开始标签中间的。PHP 解析器不关心它是否在开始标签的中间,也不需要关闭它。它也不关心在关闭 ?> 标签之后是 HTML 开始标签的结尾。因此,如果 $highlight 为真,则输出将为

<html><body>
<p class="highlight">这是一个段落。</p>
</body></html>

否则,它将是

<html><body>
<p>这是一个段落。</p>
</body></html>

使用这种方法,您可以根据某些 PHP 条件拥有具有可选属性的 HTML 标签。非常灵活且有用!
ravenswd at gmail dot com
15 年前
PHP 中需要注意的一个方面是,?> 将使您退出 PHP 代码并进入 HTML,即使它出现在 // 注释内。(这并不适用于 /* */ 注释。)这可能会导致意外的结果。例如,考虑以下这一行

<?php
$file_contents
= '<?php die(); ?>' . "\n";
?>

如果您尝试通过将其转换为注释来删除它,则会得到以下结果

<?php
// $file_contents = '<?php die(); ?>' . "\n";
?>

这将导致 ' . "\n";(以及后面的行中的任何内容)输出到您的 HTML 页面。

解决方法是使用 /* */ 标签将其注释掉,或将其改写为

<?php
$file_contents
= '<' . '?php die(); ?' . '>' . "\n";
?>
sgurukrupa at gmail dot com
10 年前
虽然正文中没有特别指出,但 HTML 转义也适用于其他控制语句

<?php for ($i = 0; $i < 5; ++$i): ?>
你好!
<?php endfor; ?>

执行上述代码片段后,我们将得到以下输出

你好!
你好!
你好!
你好!
To Top