PHP:填充表格输入非侵入式使用DOM或REGEX

时间:2012-06-11 15:12:02

标签: php regex forms dom

我正在开发用户身份验证系统。因为我希望它尽可能可定制和灵活,我不想将PHP与HTML混合使用。我开发了一个简单的模板引擎,工作得很好(仅使用纯HTML文件进行布局)。但是我的表格有问题。 在某些情况下(例如输入验证失败时)我想让它们记住以前输入的数据。我使用输出缓冲来向用户显示结束HTML,因此我将整个布局存储在一个字符串中。我在这个字符串中尝试做的是找到特定的HTML元素(通过它们的ID属性),然后更改它们的值。 我知道如何在文本或密码字段的情况下解决问题,但我也将使用组合框,那些需要以不同的方式处理。 我正在考虑使用DOM来完成任务,但到目前为止,我的尝试还没有成功。

所以这就是我想要做的事情:

  1. 使用DOM更改元素,在字符串中按ID查找元素 适当地用旧的元素替换旧的元素 字符串,但保持字符串的其余部分不变
  2. 这是一个简单(不可行)的片段(应该足以说明问题):

    <?php
    $content = "<input id=\"id\" name=\"name\" type=\"text\" value=\"\" />";
    $itemid = "id";
    $dom = new DOMDocument();
    $dom->loadXML($content);
    $item = $dom->getElementById($itemid);
    if($item)
    {
    $value = "New Value";
    $newitem = $item;
    $newitem->setAttribute('value', $value);
    $item = $item->saveXML();
    $newitem = $newitem->saveXML();
    $content = str_replace($item, $newitem, $content);
    }
    echo $content;
    ?>
    

    或者我应该选择REGEX吗?

    非常感谢你!

3 个答案:

答案 0 :(得分:1)

不,正则表达式。 DOM是正确的选择。但是,您的实施可能不正确。 IIRC,代码看起来应该是这样的:

    if ($item) {
        $value = "New Value";
        $item->removeAttribute('value');
        $item->setAttribute('value', $value);
        $content = $dom->saveXML();
    }

此外,对于<textarea><select>等元素,您的代码可能还需要额外的定制。

虽然这可能不适用于您实现系统的方式,但我建议使用jQuery。使用PHP的json_encode(),您可以将PHP变量“导入”客户端代码。然后,在导入了您的值之后,您可以使用jQuery的DOM,特别是val(),它可以智能地在表单元素上设置“值”的人类概念,因此您不必自己定制逻辑。如果您想对此选项有更多说明,请发表评论,我相信我或其他人会乐意引导您朝这个方向发展。

答案 1 :(得分:1)

您的代码的更简单版本:

<?php
$content = <<<HTML
<input id="id" name="name" type="text" value="" />
HTML;

$item_ID = "id";
$dom     = new DOMDocument();
$dom->loadHTML($content);
$item = $dom->getElementById($item_ID);
$item->setAttribute("value", "New Value");
$content = $dom->saveHTML();
echo $content;

  • 如果您要输入和输出HTML,请使用saveHTMLloadHTML方法,而不是XML方法。
  • DOMDocument已经完成了替换你的工作,所以你 不需要。
  • 对于HTML字符串,我想使用 heredoc syntax

答案 2 :(得分:1)

使用Simple dom html parser即可轻松完成。

$data = $content = "<input id=\"id\" name=\"name\" type=\"text\" value=\"\" />";
$html = str_get_html($data);
$html->find("input[id='id']",0)->value = "New Value";
echo $html->save();

不容易。