3

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

所以这就是我想要做的:

  1. 使用 DOM 在字符串中通过其 ID 查找元素 更改元素 适当地将旧元素替换为字符串中的新元素,但保持字符串的其余部分不变

这是一个简单的(不工作的)片段(应该足以说明问题):

<?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 吗?

非常感谢!

4

3 回答 3

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(),它智能地在表单元素上设置人类的“值”概念,因此您不必自己定制逻辑。如果您想对此选项进行更多说明,请发表评论,我相信我或其他人会很乐意指导您朝这个方向发展。

于 2012-06-11T15:37:26.760 回答
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 语法
于 2012-06-11T15:50:00.073 回答
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();

再简单不过了。

于 2012-06-11T17:17:21.300 回答