PHP:使用DOM或正则表达式以非侵入方式填充表单输入

PHP:使用DOM或正则表达式以非侵入方式填充表单输入,php,regex,forms,dom,Php,Regex,Forms,Dom,我正在研究一个用户认证系统。因为我希望它尽可能的可定制和灵活,所以我不想将PHP与HTML混合使用。我开发了一个简单的模板引擎,它工作得很好(只使用纯HTML文件进行布局)。但是,我对表单有一个问题。 在某些情况下(如输入验证失败),我希望让他们记住以前输入的数据。我使用输出缓冲向用户显示最终HTML,因此我将整个布局存储在一个字符串中。我试图在这个字符串中查找特定的HTML元素(通过它们的ID属性),然后更改它们的值。 我知道如何解决case文本或密码字段的问题,但我也会使用组合框,这些需要以

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

下面是我想做的:

  • 使用DOM在字符串中通过元素ID查找元素更改元素 将旧元件适当地替换为中的新元件 字符串,但保持字符串的其余部分不变
  • 下面是一个简单(不起作用)的片段(应该足以说明问题):

    
    
    还是我应该改用正则表达式


    非常感谢你

    否,到正则表达式。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();