【问题标题】:DOMDocument - appendXML() not working with formsDOMDocument - appendXML() 不适用于表单
【发布时间】:2020-04-06 09:21:35
【问题描述】:

我遇到了 appendXML() 的问题,它不会将表单附加到 HTML。

现在我有这个代码

$domdocument = new DOMDocument();
$domdocument->loadHTML($html);
$domlookup = new DOMXPath($domdocument);
$formDivs = $domlookup->query("//*[contains(@class, 'formClass')]");
$frag = $domdocument->createDocumentFragment();
$frag->appendXML($formHTML);
for ($i = $formDivs->length - 1; $i > -1; $i--) {
    $formDivs->item($i)->parentNode->appendChild($frag);
}
@$html = $domdocument->saveHTML();

代码运行良好,并使用“formCLass”类简单的 HTML 附加到 div,如文本和带有文本的 div。但是,当涉及到附加表单时……嗯……那就是另一回事了。

我也尝试过追加使用

$frag->nodeValue = $formHTML;

而不是

$frag->appendXML($formHTML);

但是还是不行……

尝试

$frag->textContent = $formHTML;

会将表单输出为文本,显然这对我不起作用。

我该如何解决这个问题?

表格代码:

<form method="post">
<div class="fb-text form-group field-petname">
<label for="petname" class="fb-text-label">
"Pet Name"<span class="fb-required">*</span>
</label>
<input type="text" placeholder="Your Pet Name" required = "required" aria-required = "true" class="form-control" name="petname" id="petname">
</div>
<div class="fb-text form-group field-petowner">
<label for="petowner" class="fb-text-label">
"Pet owner"<span class="fb-required">*</span>
</label>
<input type="text" placeholder="Insert owner's name" required = "required" aria-required = "true" class="form-control" name="petowner" id="petowner">
</div>
<div class="fb-text form-group field-phone">
<label for="phone" class="fb-text-label">
"Phone number"<span class="fb-required">*</span>
</label>
<input type="text" placeholder="Phone number" required = "required" aria-required = "true" class="form-control" name="phone" id="phone">
</div>
<div>
<div id="goldenmembership">
<i class="fas fa-truck"></i>Free delivery!
</div>
</div>
<div class="fb-select form-group field-brand">
<label for="brand" class="fb-select-label">
What brand would your pet like?<span class="fb-required">*</span>
</label>
<select class="form-control" name="brand" id="brand" required = "required" aria-required = "true">
<option value="3x20" id="brand-1">Hills - 20€</option>
<option value="3x23" id="brand-2">BioPet - 23€</option>
</select>
</div>
</form>

【问题讨论】:

    标签: php html forms append domdocument


    【解决方案1】:

    我刚刚使用您的代码和我自己的一些 HTML 组合了一个非常简单的测试用例,它似乎可以附加,如下所示。

    您的表单的 HTML 是否无效?

    如果您仍然遇到问题,能否将您的 HTML 发布到某个地方,以便我们尝试一下?

    $html = <<<HTML
    <html>
        <body>
            <div class="formClass">
                <!-- Placeholder -->
            </div>
        </body>
    </html>
    HTML;
    
    $formHtml = <<<HTML
    <form action="#" method="post">
        <input type="text" id="test"/>
    </form>
    HTML;
    
    $domdocument = new DOMDocument();
    $domdocument->loadHTML($html);
    $domlookup = new DOMXPath($domdocument);
    $formDivs = $domlookup->query("//*[contains(@class, 'formClass')]");
    $frag = $domdocument->createDocumentFragment();
    $frag->appendXML($formHtml);
    for ($i = $formDivs->length - 1; $i > -1; $i--) {
        $formDivs->item($i)->parentNode->appendChild($frag);
    }
    $html = $domdocument->saveHTML();
    
    echo $html;
    

    HTML 输出:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
    <html>
        <body>
            <div class="formClass">
                <!-- Placeholder -->
            </div>
        <form action="#" method="post">
        <input type="text" id="test">
    </form></body>
    </html>
    

    【讨论】:

    • 我真的很困惑。出于某种原因,在我的服务器上使用与 $formHtml 相同的值,它不起作用:)
    • 奇怪,你运行的是什么PHP版本?我在 PHP 7.4 上运行了这个,但它应该可以追溯到更远的地方。这是它在其他地方运行的示例:sandbox.onlinephpfunctions.com/code/…
    • 刚刚测试回 PHP 5.1.5 并且可以工作,所以应该很安全。您是否尝试过在您的服务器上完全运行我的代码,而脚本中没有其他内容?这行得通吗?
    • 呵呵@Aran,你的代码骗了我一点,我只是复制->粘贴,你的变量是$formHtml,我的函数appendXML正在寻找$formHTML。无论如何,是的,它现在也对我有用。我还编辑了问题并插入了表单的代​​码,因为我的表单仍然无法正常工作......也许你看到了我遗漏的东西......
    • 好的,我自己想出来了...输入标签没有正确关闭 在我的表单中...缺少“/”.. .谢谢@Aran 的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    相关资源
    最近更新 更多