【问题标题】:Is there a better way to write HTML strings in PHP?有没有更好的方法在 PHP 中编写 HTML 字符串?
【发布时间】:2017-10-16 08:12:13
【问题描述】:

我发现自己用 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>

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

谢谢

【问题讨论】:

  • 恕我直言,如果您的 PHP 脚本像这样输出“长 HTML 字符串”,那么您做错了什么。您应该将逻辑(PHP 代码)和 HTML 分开。在这种情况下,将 HTML 放在一个单独的文件中,并在需要时包含它。
  • php.net/heredoc 将为您指明正确的方向。但简而言之,标签
  • 放弃手动编写 HTML 并使用 DOMDocument 是一种选择。

标签: php string


【解决方案1】:

PHP 知道几种syntax to declare a string

所以你不必使用双引号本身。

【讨论】:

    【解决方案2】:

    如果您需要一种可用于将 HTML 存储到字符串中的方法,这就是实现的方法。

    我不会使用任何其他建议的方法哈哈,我会使用输出缓冲区。这些其他方法看起来都非常肮脏(因为在规模上会有很多特殊字符飞来飞去)......所以冒着冒犯某人的风险我只会说出我喜欢我的方式的原因。

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

    使用 IDE 时,您仍然可以在 HTML 和 PHP 相互分离时获得出色的智能感知帮助,并且仍然可以快速编写通用 DOM 对象。

    查看代码时,它看起来更易于阅读。

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

    当使用 HTML 作为字符串方法时,尝试使用各种字符串函数搜索和替换方法来在运行后更改一些代码会变得非常困难。例如,在一大串其他 HTML 元素中查找 &lt;img&gt; 标签可能会令人生畏,尤其是在尝试在标签之间查找内容时...

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

    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
    

    【讨论】:

    • 这比使用字符串或 HEREDOC 更具可读性。这种方法有什么缺点吗?
    • 这是我构建 HTML 的首选方法。可读且非常容易理解。
    • @JohnBell,是的,我发现使用大多数智能感知应用程序都可以获取的清晰、干净的代码将新人加入我的代码库更容易。更不用说删除 100 个&lt;?php ?&gt; 标签的混乱了。此外,这允许我的 Sublime Text 的 Emmet 插件仍然可以工作;)
    【解决方案3】:

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

    // 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 应该从函数返回。
    • @Felix:函数不应返回 HTML。
    • @RoToRa:取决于...如果您编写模板生成器或其他什么。通常不,我同意,但有用例。
    • +1 表示“函数不应返回 HTML”。将您的表示层与业务层分开。有一些框架可以让这变得更容易。查看 Zend MVC。
    【解决方案4】:

    您可以使用 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;
    }
    
    ?>
    

    【讨论】:

    • 实际上这行不通,因为结束分隔符前后不能有空格。
    • 噢!我责怪代码块空间。 :P 我对其进行了编辑以修复。
    • 需要有一个 ; EOS之后
    【解决方案5】:

    您要查找的是heredoc syntaxnowdoc syntax

    【讨论】:

      【解决方案6】:

      有时由于某种原因,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】:

        正如 Haim 所说 - heredocs 是要走的路。

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

        所以,例如:

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

        【讨论】:

          【解决方案8】:

          我喜欢推荐这个 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');
          });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-09-05
            • 2018-12-01
            • 1970-01-01
            • 2011-01-01
            • 1970-01-01
            • 2023-01-25
            • 2020-04-03
            相关资源
            最近更新 更多