PHP:使用DOM或正则表达式以非侵入方式填充表单输入
我正在研究一个用户认证系统。因为我希望它尽可能的可定制和灵活,所以我不想将PHP与HTML混合使用。我开发了一个简单的模板引擎,它工作得很好(只使用纯HTML文件进行布局)。但是,我对表单有一个问题。 在某些情况下(如输入验证失败),我希望让他们记住以前输入的数据。我使用输出缓冲向用户显示最终HTML,因此我将整个布局存储在一个字符串中。我试图在这个字符串中查找特定的HTML元素(通过它们的ID属性),然后更改它们的值。 我知道如何解决case文本或密码字段的问题,但我也会使用组合框,这些需要以不同的方式处理。 我曾考虑使用DOM来完成这项任务,但到目前为止,我的尝试还没有成功 下面是我想做的:PHP:使用DOM或正则表达式以非侵入方式填充表单输入,php,regex,forms,dom,Php,Regex,Forms,Dom,我正在研究一个用户认证系统。因为我希望它尽可能的可定制和灵活,所以我不想将PHP与HTML混合使用。我开发了一个简单的模板引擎,它工作得很好(只使用纯HTML文件进行布局)。但是,我对表单有一个问题。 在某些情况下(如输入验证失败),我希望让他们记住以前输入的数据。我使用输出缓冲向用户显示最终HTML,因此我将整个布局存储在一个字符串中。我试图在这个字符串中查找特定的HTML元素(通过它们的ID属性),然后更改它们的值。 我知道如何解决case文本或密码字段的问题,但我也会使用组合框,这些需要以
还是我应该改用正则表达式
非常感谢你 否,到正则表达式。DOM是正确的选择。但是,您的实现可能不正确。IIRC,代码应该是这样的:
if ($item) {
$value = "New Value";
$item->removeAttribute('value');
$item->setAttribute('value', $value);
$content = $dom->saveXML();
}
此外,对于
和
等元素,您的代码可能需要额外的裁剪
虽然这可能不适合您实现系统的方式,但我建议您使用jQuery。使用PHP,您可以将PHP变量“导入”到客户端代码中。然后,在导入了值之后,您可以使用jQuery的DOM,特别是它可以智能地在表单元素上设置人类的“值”概念,因此您不必自己定制逻辑。如果您想对此选项进行更多说明,请发表评论,我相信我或其他人会很乐意为您提供这方面的指导。代码的更简单版本:
<?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;
这很容易用
$data=$content=”“;
$html=str_get_html($data);
$html->find(“输入[id='id']”,0)->value=“新值”;
echo$html->save();
非常简单。谢谢您的回复。您的代码可以工作,但它并不能解决我的问题,因为我实际上是在输出XHTML。但我至少知道什么时候使用loadHTML。谢谢。代码确实不正确。您提到的Jquery选项听起来很有趣,但现在,如果可能的话,我宁愿不使用Javascript。很好的建议-看起来正是我想要的。最好的事情是,与DOM保存方法不同,这个脚本似乎使(X)HTML的其余部分保持不变。是的,DOMDocument saveXML通过读取生成一个经过修改的HTML版本。但我认为还有更好的美容师。。因此,真正的任务是轻松地更改/检索所需的属性/标记。我测试了很多这样的工具(SimpleDomHTML解析器、phpquery、ganon),但出于速度/易用性的考虑,我倾向于使用第一个工具。
<?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;
$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();