有没有更好的方法在PHP中编写HTML字符串?

时间:2010-12-22 14:25:14

标签: php string

我发现自己在PHP中编写了许多返回HTML代码的函数。他们可能看起来像这样:

function html_site_head()
{
    return
        "
            <div id=\"site_header\">
                <div id=\"site_header_inner\">
                    <div id=\"site_header_logo\"></div>

                    <div id=\"site_header_countdown\">BARE XX DAGER IGJEN</div>
                </div>
            </div>
        ";
}

现在我发誓我已经看到了用PHP编写长字符串的更好方法。我喜欢python的做法:

return """
    <div id="site_header">
        <div id="site_header_inner">
            <div id="site_header_logo"></div>

            <div id="site_header_countdown">BARE XX DAGER IGJEN</div>
        </div>
    </div>
"""

因为你不必逃避引号。另一种方法是使用单引号,但这意味着不要在字符串中直接使用PHP变量。我发誓我在PHP中看到过这样的东西:

return <<<
    <div id="site_header">
        <div id="site_header_inner">
            <div id="site_header_logo"></div>

            <div id="site_header_countdown">BARE XX DAGER IGJEN</div>
        </div>
    </div>

或类似的东西。有人能刷新我的记忆吗?

由于

9 个答案:

答案 0 :(得分:17)

PHP知道几种syntax to declare a string

所以你不必使用双引号。

答案 1 :(得分:11)

如果您需要一种可用于将HTML存储到字符串中的方法,则可以使用此方法。

我不会使用任何其他建议的方法lol,我会使用输出缓冲区。这些其他方法看起来都很脏(因为大规模会有很多特殊角色飞来飞去)......所以冒着冒犯别人的风险,我只会说出我喜欢的方式。

如果您像我一样使用输出缓冲区......

使用IDE时,您仍然可以获得很好的智能帮助,将HTML和PHP彼此分开,并且仍然可以快速编写通用DOM对象。

查看代码时,它看起来更具人性化。

HTML代码可以在其DOM就绪状态下传递,而不是作为最终需要解析并最终创建为DOM就绪状态的字符串。

当使用HTML作为字符串方法时,尝试使用各种字符串函数搜索和替换方法以便在运行时更改一些代码后会非常粗糙。例如,在大量其他HTML元素中查找<img>标记可能会令人生畏,尤其是在尝试在标记之间查找内容时...

我会像这样使用输出缓冲流......

ob_start();
?>
    <div id="site_header">
        <div id="site_header_inner">
            <div id="site_header_logo"><?php echo $PhpVar; ?></div>
            <div id="site_header_countdown">BARE XX DAGER IGJEN</div>
        </div>
    </div>
<?php
$output = ob_get_clean();
ob_flush();

return $output; OR return echo $output

答案 2 :(得分:7)

它被称为heredoc语法:

return <<< END
<div id="site_header">
<div id="site_header_inner">
<div id="site_header_logo"></div>    
<div id="site_header_countdown">BARE XX DAGER IGJEN</div>
</div>
</div>
END;

答案 3 :(得分:2)

更好的方法 - 不要写意大利面条代码,使用模板或

// php code
?>
<div id="site_header">
    <div id="site_header_inner">
        <div id="site_header_logo"><?=$echoPhpVar?></div>
        <div id="site_header_countdown">BARE XX DAGER IGJEN</div>
    </div>
</div>
<?php
//php code

答案 4 :(得分:1)

您要找的是heredoc syntaxnowdoc syntax

答案 5 :(得分:1)

您可以使用HEREDOC:

<?php

function blah() {
  $bar = <<<EOS
  <div id="site_header">
        <div id="site_header_inner">
            <div id="site_header_logo"></div>

            <div id="site_header_countdown">BARE XX DAGER IGJEN</div>
        </div>
  </div>
EOS;

return $bar;
}

?>

答案 6 :(得分:1)

有时由于某种原因发生PHP或Javascript或一些顽皮的插入很多反斜杠。普通功能没有注意到。因此,该位必须“膨胀”:

<?php
function removeslashes($string)
{
    $string=implode("",explode("\\",$string));
    return stripslashes(trim($string));
}

/* Example */

$text="My dog don\\\\\\\\\\\\\\\\'t like the postman!";
echo removeslashes($text);
?>

RESULT: My dog don't like the postman!

这部电影很适合我,因为我以前遇到过这个问题。

来源:here

答案 7 :(得分:0)

正如海姆所说 - heredoc是要走的路。

如果您发现自己编写单行,请记住(或意识到)您可以对HTML属性使用单引号(不要相信任何试图告诉您它们无效的人)。

所以,例如:

$html = "<div id='blah'>$contents</div>";

答案 8 :(得分:0)

我想建议这个PHP库可以使用php处理几乎任何HTML标记,并使用闭包嵌套,这也有助于提高可读性。

https://github.com/raftalks/Form

例如 - div标签内的表

Html::make('div', function($html))
{
    $html->table(function($table)
    {
        $table->thead(function($table)
        {
            $table->tr(function($tr)
            {
                $tr->th('item');
                $tr->th('category');
            });
        });


        $table->tr(function($tr)
        {   
            $tr->td()->ng_bind('item.name','ng-bind');
            $tr->td()->ng_bind('item.category','ng-bind');

            $tr->setNgRepeat('item in list','ng-repeat'); //using second parameter to force the attribute name.
        });

        $table->setClass('table');
    });

   $html->setClass('tableContainer');
});