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

有没有更好的方法用PHP编写HTML字符串?,php,string,Php,String,我发现自己用PHP编写了许多返回HTML代码的函数。它们可能看起来像这样: function html_site_head() { return " <div id=\"site_header\"> <div id=\"site_header_inner\"> <div id=\"site_header_logo\"></div>

我发现自己用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>
        ";
}
函数html\u site\u head()
{
返回
"
裸XX达格伊格延
";
}
现在我可以发誓,我已经看到了用PHP编写长字符串的更好方法。我喜欢python的做法:

return”“”
裸XX达格伊格延
"""
因为你不必逃避引号。另一种方法是使用单引号,但这意味着不能在字符串中直接使用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>

returnPHP知道以下几种:


  • 你要找的是或。

    正如哈伊姆所说-
    herdoc
    s是一条路要走

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

    因此,例如:

    $html = "<div id='blah'>$contents</div>";
    
    $html=“$contents”;
    
    您可以使用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;
    }
    
    ?>
    

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

    // 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
    
    //php代码
    ?>
    裸XX达格伊格延
    
    我建议使用这个PHP库,它可以用PHP生成几乎任何HTML标记,并使用闭包嵌套,这也有助于可读性

    例如-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');
    });
    

    如果您需要一个可以用来将HTML存储到字符串中的方法,这是一种方法

    我不会使用任何其他建议的方法lol,我会使用一个输出缓冲区。这些其他的方法看起来都非常肮脏(因为在规模上会有很多特殊的角色四处飞行)。。。因此,冒着冒犯他人的风险,我只想说出我喜欢自己的方式的原因

    如果你像我一样使用输出缓冲

    当使用IDE时,您仍然可以在HTML和PHP彼此分离的情况下获得强大的IntelliSense帮助,并且仍然可以快速编写通用DOM对象

    当查看代码时,它看起来更具可读性

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

    当使用HTML作为字符串方法时,尝试使用各种字符串函数search和replace方法以便在运行后更改一些代码可能会变得非常粗糙。例如,在大量其他HTML元素字符串中查找
    标记可能会让人望而生畏,尤其是在尝试在标记之间查找内容时

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

    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
    
    ob_start();
    ?>
    裸XX达格伊格延
    
    有时由于某种原因,PHP或Javascript或一些顽皮的代码会插入很多反斜杠。普通函数没有注意到这一点。因此,有必要对钻头进行“充气”:


    困难,如果HTML应该从函数返回。@Felix:函数不应该返回HTML。@RoToRa:取决于。。。如果你写了一个模板生成器或者别的什么。通常不会,我同意,但有一些用例。+1表示“函数不应该返回HTML”。将表示层与业务层分离。有一些框架使这变得更容易。查看Zend MVC.IMHO,如果您的PHP脚本输出了这样的“长HTML字符串”,那么您就错了。您应该将逻辑(PHP代码)和HTML分开。在本例中,将HTML放在一个单独的文件中,并在需要时包含它。php.net/herdoc将为您指明正确的方向。但简而言之,放弃手动HTML编写和使用
    DOMDocument
    是一种选择。实际上这不起作用,因为结尾分隔符前后不能有空格。Doh!我责备代码块空格P我编辑它来修复。需要有一个;在EOS之后,这是比使用字符串或HEREDOC更具可读性的HTML。这个方法有什么缺点吗?这是我用来构建HTML的方法。可读性强且易于理解。@JohnBell,是的,我发现用大多数intellisense应用程序都能找到的清晰、清晰的代码将新用户加入我的代码库更容易。更不用说删除100个
    标签的混乱了。此外,这还允许我的Emmet插件用于Sublime文本,仍然可以工作;)
    <?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;
    }
    
    ?>
    
    // 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
    
    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');
    });
    
    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
    
    <?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!