我正在开发用户身份验证系统。因为我希望它尽可能可定制和灵活,我不想将PHP与HTML混合使用。我开发了一个简单的模板引擎,工作得很好(仅使用纯HTML文件进行布局)。但是我的表格有问题。 在某些情况下(例如输入验证失败时)我想让它们记住以前输入的数据。我使用输出缓冲来向用户显示结束HTML,因此我将整个布局存储在一个字符串中。我在这个字符串中尝试做的是找到特定的HTML元素(通过它们的ID属性),然后更改它们的值。 我知道如何在文本或密码字段的情况下解决问题,但我也将使用组合框,那些需要以不同的方式处理。 我正在考虑使用DOM来完成任务,但到目前为止,我的尝试还没有成功。
所以这就是我想要做的事情:
这是一个简单(不可行)的片段(应该足以说明问题):
<?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吗?
非常感谢你!
答案 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;
saveHTML
和
loadHTML
方法,而不是XML方法。DOMDocument
已经完成了替换你的工作,所以你
不需要。答案 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();
不容易。