代码之家  ›  专栏  ›  技术社区  ›  Samuel

在PHP字符串中存储HTML的替代方法

php
  •  4
  • Samuel  · 技术社区  · 14 年前

    我正在寻找一种更好的方法从PHP生成动态HTML。

    在我这样做之前:

    //generate.php
    for(...)
    {
        $markup .= '<a id="'.$i.'">link'.$i.'</a>';
    }
    

    这真的很难看,我更愿意不用在PHP字符串中内联定义标记。

    我正在寻找的功能 include "markup.php"; ,但我需要能够将结果存储到字符串中,而不是立即输出。像下面这样的东西会很好。

    //generate.php
    for(...)
    {
        $markup .= include "markup.php";
    }
    
    //markup.php
    <a id="<?=$i?>">link<?=$i?></a>
    
    5 回复  |  直到 14 年前
        1
  •  1
  •   Borealid    14 年前

    使用模板化引擎,如smarty tpl。他们就是这样。

    它们都将HTML显示与逻辑分离,并提供方便的功能来生成冗长的东西,如HTML单选按钮。

        2
  •  1
  •   Cfreak    14 年前

    我相信第二种方法实际上是有效的,只要包含的文件以返回语句结尾。但是,为什么不使用模板引擎,例如 Smarty ?

    在smarty中(我确信还有其他循环,但它们是面向标记的)。另外,在调用display()方法之前,不会输出模板的结果。这允许您分配所需的任何变量。您的示例如下:

    PHP:

    $links = array('http://stackoverflow.com/','http://google.com'); // whatever you're looping over.
    $smarty->assign('links', $links);
    // ... other processing ... etc.
    $smarty->display('path/to/template.tpl');
    

    模板:

    <html>
    <body>
    {foreach from=$links item=$link }
    <a href="{$link}">link {$link}</a>
    {/foreach}
    </body>
    </html>
    
        3
  •  1
  •   jhchen    14 年前

    你可以这样做:

    ob_start();
    include 'yourfile.php';
    $markup = ob_get_contents();
    

    查看输出缓冲的其他功能: http://www.php.net/manual/en/ref.outcontrol.php .

        4
  •  0
  •   Josh K    14 年前

    为什么不直接抛出PHP?你能告诉我们为什么要在输出前存储它吗?

    for(...)
    {
        ?><a id="<?php echo $i; ?>">link <?php echo $i; ?></a><?php
    }
    

    你真的不应该使用短标签。

        5
  •  0
  •   Richard JP Le Guen    14 年前

    根据@jcmonkey的建议,您可以编写如下函数:

    function markup($i) {
        ob_start();
        include 'markup.php';
        return ob_get_contents();
    }
    

    …带文件 markup.php 看起来像这样:

    <?php /* I don't like using short_open_tag */ ?>
    <a id="<?php echo $i; ?>">link<?php echo $i; ?></a>
    

    然后你可以打电话 markup() 在for循环中:

    for(...)
    {
        $markup .= markup($i);
    }