有没有更好的方法用PHP编写HTML字符串?
我发现自己用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>
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!