library.php

我自己的HTML标签编码器,将根据输入内容打印HTML代码。

<?php
    function tag($tagname, $content = NULL, array $properties = NULL)
    {
        $html = "<$tagname";

        if (!($properties === NULL))
        foreach ($properties as $name => $value) {
            $html .= " $name=\"$value\"";
        }

        $html .= ($content === NULL || $content == "") ? " />" : ">$content</$tagname>";

        return $html;
    }
?>


index.php

将运行库中的HTML编码器的测试index.php文件。

<?php 
    require 'library.php';

    echo tag("head",
        tag("meta","",array("name"=>"title","content"=>"Test Print"))
    );
    echo tag("body",
        tag("div",tag("p","test print".tag("br")."test print"),array())
    );
?>


输出:

<head><meta name="title" content="Test Print" /></head><body><div><p>test print<br />test print</p></div></body>


问题:

使用此库将使我的代码在添加更多PHP代码时更具可读性。我可以使用此<div><?php $variable ?></div>代替此echo tag("div",$variable);,但与仅键入HTML代码相比,后者肯定会更长。

我是否应该创建此类函数并继续使用HTML编码?

评论

我只想使用可读性更高的注释,并在注释中注释较小的注释,然后在生产版本中取消注释并最小化整个内容。并且当跟踪错误或更新时,我会使用原始的更改,然后使用更改,重复取消注释和最小化的过程

我会说你已经给自己写了一个宏。

#1 楼

您处在正确的轨道上,但是echo并不是执行IMO的正确工具。

一般来说,对于XML,我们可以这样表示数据:

array('tag', $attributes, $children);

子元素的嵌套使我们可以执行此操作(子元素是嵌套元素的数组,或者是简单文本子元素的字符串)。

array('div',
      array('class' => 'container'),
      array(array('span', array(), 'One'),
            array('span', array(), 'Two')));


它代表:

<div class="container">
    <span>One</span>
    <span>Two</span>
</div>


使用XMLWriter,我们可以编写此结构而没有太多麻烦。我在我的图书馆里这样做。无论模板应出现在什么上下文中,XMLWriter的输出总是正确缩进。这是使数据结构与要解决的问题相匹配的经典示例。通过创建代表X(HT)ML的树,我们可以构建结构组件在代码中所处的位置,而不是被迫以正确的顺序获取所有回显语句。

#2 楼

坚持使用HTML和嵌入式PHP有几个优点:


您将获得适当的语法突出显示。
您可以利用代码完成功能。
PHP方法在代码中以及在呈现时缺乏对HTML元素的适当缩进。
可以在浏览器中查看(某种程度上)文件。
设计人员可以修改HTML,只要他们知道如何识别

话虽如此,使用PHP方法,您可以在一处处理适当的HTML转义属性值(尽管您没有),以执行正确的规则。

我构建了一些帮助程序类,用于从ImageContentItem模型对象生成当前项目的图像和文章链接元素。这些类具有为属性命名的setter方法,并在执行正确的HTML转义时从基础模型对象中提取合理的值。页面的大部分是HTML和PHP,但是这些类使嵌入链接或图像非常容易:

<div>
    Here is a picture of the car:
    <br/>
    <?= $this->img($car->getImage())->alt($car->getDescription()) ?>
</div>


#3 楼

使用htmlentities()转义内容和属性值是绝对关键的。否则,您可能会得到无效的输出,或者在最坏的情况下可能会出现HTML注入漏洞。 (您也许可以相信标记名和属性名不包含特殊字符。)

#4 楼

如果您想使用易读易懂的代码,请考虑使用HAML。您不必在那里关闭标签,它仍将是单个演示文稿文件,而不像您建议的那样成块