PHP中的HTML标记操作

时间:2012-01-15 13:38:59

标签: php html dom

使用PHP DOM - html操作。这是输出HTML标记的非常有效的方法(至少可以防止代码中的逻辑和标记混乱)。

但是,要生成50行html标记,必须在PHP中编写大约200行:(。

示例代码:

...

$signup_form = $document->createElement('form');
$signup_form->setAttribute('id', 'signup_form');
$signup_form->setAttribute('action', 'registration/signup.php');
$signup_form->setAttribute('method', 'post');
$su_fname_label = $document->createElement('label');
$su_fname_label->setAttribute('for', 'fname');
$su_fname_label_content = $document->createTextNode('Name');
$su_fname_label->appendChild($su_fname_label_content);
$su_fname_textbox = $document->createElement('input');
$su_fname_textbox->setAttribute('name', 'fname');
$su_fname_textbox->setAttribute('class', 'valid');
$su_fname_textbox->setAttribute('placeholder', 'Please enter your name');
$su_fname_textbox->setAttribute('type', 'text');

...

如你所见,它只是形式的一个元素。想象一下,如果HTML表单中有5个元素,那么php代码将是巨大的。我想知道,有没有办法缩小前任。通过一次设置多个属性?有什么建议吗?

4 个答案:

答案 0 :(得分:0)

为什么不输出HTML并启用输出缓冲。然后,您可以使用tidy扩展名过滤掉输出,并确保输出HTML有效,同时仍然与编写纯HTML一样快。

尽管如此,正如@Gordon建议的那样:

  

tidy几乎不适合以编程方式创作(x)html。它更像是一个后处理器。

答案 1 :(得分:0)

使用DOM生成html输出的原因是什么?没有办法让DOM 简洁

通常你只是使用PHP进行模板化。像这样创建一个单独的文件:

<?php // template.php
echo '<!DOCTYPE html>',"\n";
?>
<html>
    <head>
    <meta charset="utf-8">
    <title><?=htmlspecialchars($title, ENT_NOQUOTES, 'utf-8')?></title>
    </head>
    <body>
       <form id="signup_form" action="registration/signup.php" method="post">
           <label for="fname">Name</label>
           <input id="fname" name="fname" class="valid" placeholder="Please enter your name" type="text">
       </form>
    </body>
</html>

然后使用模板函数:

function render($__filename, $__data) {
    extract($__data, EXTR_SKIP);
    ob_start();
    include $__filename;
    return ob_get_clean();
}

从代码中渲染模板,如下所示:

do_something();
$templatedata = array('title'=>'The Title');
$html = render('template.php', $templatedata);

如果你想要一些节点感知的东西(这是确保格式良好和正确转义的好主意!),你可以使用XSLT或第三方模板引擎,如PHPTAL

答案 2 :(得分:0)

我曾经做过你正在做的事情,直到我意识到它不是很易读。您必须分析代码以确定正在构建的标记。维护起来也比较困难。正如您所说,向表单添加单个字段需要相当多的代码,并且进行更改需要挖掘所有代码。我同意希望将PHP逻辑与标记分开;但是,有更好的方法可以保持代码清洁,具体取决于您要做的事情。

无需进入第三方解决方案,您可以:

  1. Load markup from a separate file into a DOM object进一步操纵。

  2. 使用PHP作为模板引擎,通过在您的标记中嵌入PHP来实现它。正如Col. Shrapnel非常雄辩地解释道:“[E] mbedded PHP允许您在站点范围内将业务逻辑与表示逻辑分开,支持任何大小和结构的模板......”。

  3. 使用heredoc syntax将标记分配给变量。虽然不是最佳选择,但它比纯粹基于DOM的方法更容易阅读。

  4. $signup_form = <<<EndHTMLForm
    <form id="signup_form" action="registration/signup.php" method="post">
        <label for="fname">Name</label>
        <input name="fname" class="valid" placeholder="Please enter your name" type="text">
    </form>
    EndHTMLForm;
    

    我的目的不是引导你离开第三方解决方案,而是用普通的PHP来说明替代方法。 DOM很冗长。它当然有很多优点,但从头开始创建标记并不是其中之一。

答案 3 :(得分:0)

根据您对速度的需求以及是否能够使用缓存等,可以使用phpQuery等库。

它是PHP的jQuery类型的“端口”,具有与jQuery相同的多功能性和简单性。但是,根据我的经验,它并不像我在生成代码时那么快(我没有,但是,进行了任何彻底的测试,这只是一种感觉)。

您作为示例提供的代码可以使用phpQuery未经测试的)来表示:

$form = pq ('<form />')
          ->attr (array (
                    'id' => 'signup_form',
                    'action' => 'registration/signup.php',
                    'method' => 'POST',
                  ));
$label = pq ('<label />')
          ->html ('Name')
          ->attr ('for', 'fname')
          ->appendTo ($form);
$text = pq ('<input />')
          ->attr (array (
                    'name' => 'fname',
                    'data-placeholder' => 'Please enter your name',
                    'type' => 'text',
                  ))
          ->addClass ('valid')
          ->appendTo ($label);

我用我喜欢的格式编写它,它比你提供的代码略多一些;但如果您更喜欢更紧凑的编码,它可以很容易地减少到5-10左右,并保持可读性。无论如何,我发现阅读起来要容易得多,而且你不必编写那么多DOM代码来生成相当多的HTML代码。

此外,鉴于phpQuery使用与jQuery相同的包装概念,上述代码中的展开节点(例如$form)是常规DOMNode,除非包裹在pq()。这为您提供了很大的灵活性,可以使用phpQuery的便捷例程,也可以使用PHP DOM的更“基本”功能。