如何在PHP中回显HTML?


122

我想有条件地输出HTML以生成页面,那么在PHP 4+中回显HTML的多行代码段的最简单方法是什么?我需要使用像Smarty这样的模板框架吗?

echo '<html>', "\n"; // I'm sure there's a better way!
echo '<head>', "\n";
echo '</head>', "\n";
echo '<body>', "\n";
echo '</body>', "\n";
echo '</html>', "\n";

2
\ n在html中不起作用。我猜你的意思是回声“ <br>”;
曾伟石

好主意是要从逻辑上分离您的逻辑(例如在MVC中)。使用Twig之类的Templetig引擎将您的视图与脚本逻辑分开 -twig.sensiolabs.org安装了将您的html标记实现到php脚本的方法,可以通过其他方法来实现。实现php变量,以Twig Temple。一旦您理解了我的意思,您就会看到这种方法的好处。嫩枝解决了这类问题。对于少量的代码,您可以编写自己的细枝扩展,然后将其与秒针配合使用以执行一些复杂但重复的任务。
DevWL

Answers:


269

有几种方法可以在PHP中回显HTML。

1.在PHP标记之间

<?php if(condition){ ?>
     <!-- HTML here -->
<?php } ?>

2.回声中

if(condition){
     echo "HTML here";
}

对于回声,如果您希望在HTML中使用双引号,则必须使用单引号回声,如下所示:

echo '<input type="text">';

或者您可以这样逃避它们:

echo "<input type=\"text\">";

3. Heredocs

4. Nowdocs(从PHP 5.3.0开始)

模板引擎用于在大多数包含HTML的文档中使用PHP。实际上,PHP的最初目的是成为一种模板语言。这就是使用PHP可以使用短标签之类的东西来回显变量的原因(例如<?=$someVariable?>)的原因。

还有其他模板引擎(例如Smarty,Twig等)使语法更加简洁(例如{{someVariable}})。

使用模板引擎的主要好处是使设计(表示逻辑)与编码(业务逻辑)保持分离。从长远来看,这也使代码更整洁,更易于维护。

如果您还有其他问题,请随时发表评论。

PHP文档中提供了有关这些内容的进一步阅读。


注意:不建议使用PHP短标记<??>因为只有在使用short_open_tagphp.ini配置文件指令启用了PHP短标记的情况下,或者如果使用该--enable-short-tags选项配置了PHP,它们才可用。无论从5.4以后的设置如何,它们都可用


7
“ / * HTML here * /”真的不应该是“ <!-HTML here->”吗?;)
杰里米·洛根

是的,在第一篇文章中您是正确的。我陷入了代码哈哈。谢谢。
克里斯·比尔

1
谢谢,@克里斯·B。它帮助了我。对于回声,如果您希望在HTML中使用双引号,则必须使用单引号回声,如下所示:我实际上错过了这一点。
Ayush Mishra

1
答案中的第一个链接现已删除:(
mcon

实际上,从5.4开始,唯一可用的短标签就是短回声标签<?=$var?>。通常不鼓励使用短标签,并且应将其删除(<? doStuff() ?>)。
igorsantos15年

65

像这样尝试(heredoc语法):

$variable = <<<XYZ
<html>
<body>

</body>
</html>
XYZ;
echo $variable;

8
@MhdSyrwan只是随机字符,你可以在这里阅读更多php.net/manual/en/...
LFX

1
关心详细吗?我没有看到打开或关闭PHP括号,但是同时看到HTML和PHP,是吗?-链接可以正常工作并更好地回答,但也许应该在答案文本中,而不是注释中?
Julix

当然@Julix你需要添加开(取决于)关闭PHP标签。他只是想简单地举例说明。

我知道了; 我以某种方式错过了这是heredocs语法(即整个代码是php)。我感到困惑,因为那时我还不熟悉PHP,并且习惯于看到像<?php $variable = "bla"; ?> <html> <body class="<?php echo $variable ?>"> </body> </html>---这样的语法, 所以我以为缺少了许多括号,不确定它们到底在哪里。当我回答稍老的评论时,总是很有趣,因为那时我还很陌生。
Julix

30

您可以将替代语法用于控制结构并突破PHP:

<?php if ($something): ?>
    <some /> <tags /> <etc />
    <?=$shortButControversialWayOfPrintingAVariable ?>
    <?php /* A comment not visible in the HTML, but it is a bit of a pain to write */ ?>
<?php else: ?>
    <!-- else -->
<?php endif; ?>

@杰里米:这可能是最好,最直接的方法,前提是您不想再找其他东西了。
Frank V

1
是的,特别是在HTML之间使用PHP注释的能力,这些注释不会被回显。
TheFlash

15

基本上,您可以将HTML放在PHP标记之外的任何位置。在显示任何数据之前进行所有必要的数据处理,以分离逻辑和表示,这也非常有益。

数据显示本身可以在同一PHP文件的底部,或者您可以包括一个主要由HTML组成的单独PHP文件。

我更喜欢这种紧凑的样式:

<?php
    /* do your processing here */
?>

<html>
<head>
    <title><?=$title?></title>
</head>
<body>
    <?php foreach ( $something as $item ) : ?>
        <p><?=$item?></p>
    <?php endforeach; ?>
</body>
</html>

注意:您可能需要使用 <?php echo $var; ?>而不是<?=$var?>取决于您的PHP设置。


7

我偏爱这种风格:

  <html>
    <head>
<%    if (X)
      {
%>      <title>Definitely X</title>
<%    }
      else
      {
%>      <title>Totally not X</title>
<%    }
%>  </head>
  </html>

我确实使用ASP样式的标签,是的。在我看来,PHP和HTML的融合看起来超级可读。诀窍在于使<%%>标记正确。


ASP标记与PHP 4+兼容吗?
TheFlash

4
是的,但是在它们持续使用时得到了它们-它们已从PHP中删除(不确定哪个版本...如果还没有发布的话)
Greg

7

在这种情况下,另一种方法是将HTML放在单独的文件中,并用占位符[[content]]标记要更改的区域。(您也可以使用sprintf代替str_replace。)

$page = 'Hello, World!';
$content = file_get_contents('html/welcome.html');
$pagecontent = str_replace('[[content]]', $content, $page);
echo($pagecontent);

另外,您也可以将所有PHP内容输出到缓冲区中捕获的屏幕上,编写HTML,然后将PHP输出放回页面中。

写出PHP,捕获它,然后再次写它似乎很奇怪,但这确实意味着您可以进行各种格式化工作(heredoc等),并且可以正确测试输出,而无需页面麻烦模板妨碍。(顺便说一句,Joomla CMS就是这样做的。)

即:

<?php
    ob_start();
    echo('Hello, World!');
    $php_output = ob_get_contents();
    ob_end_clean();
?>
<h1>My Template page says</h1>
<?php
    echo($php_output);
?>
<hr>
Template footer

2

只需使用print函数来回显PHP文件中的文本,如下所示:

<?php

  print('
    <div class="wrap">

      <span class="textClass">TESTING</span>

    </div>
  ')
?>

2
$enter_string = '<textarea style="color:#FF0000;" name="message">EXAMPLE</textarea>';

echo('Echo as HTML' . htmlspecialchars((string)$enter_string));

1

除了Chris B的答案外,如果您echo仍然需要使用它,仍然希望保持其简单和结构化,并且不希望使用<?php stuff; ?> s,则可以使用以下语法。

例如,您要显示画廊的图像:

foreach($images as $image)
{
    echo
    '<li>',
        '<a href="', site_url(), 'images/', $image['name'], '">',
            '<img ',
                'class="image" ',
                'title="', $image['title'], '" ',
                'src="', site_url(), 'images/thumbs/', $image['filename'], '" ',
                'alt="', $image['description'], '"',
            '>',
        '</a>',
    '</li>';
}

Echo采用了多个参数,因此缩进效果很好。echo与参数一起使用还比串联更有效。


1
echo '
<html>
<body>
</body>
</html>
';

要么

echo "<html>\n<body>\n</body>\n</html>\n";

1

试试这个:

<?php
    echo <<<HTML

    Your HTML tags here

HTML;
?>

0

不要回显HTML。

如果要使用

<?php echo "<h1>  $title; </h1>"; ?>

您应该这样做:

<h1><?= $title;?></h1>

-1

这是我的方法:

<?php if($contition == true){ ?>
         <input type="text" value="<?php echo $value_stored_in_php_variable; ?>" />
<?php }else{ ?>
         <p>No input here </p>
<?php } ?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.