我认为最好的方法是将它加载到 DomDocument 中。出于性能考虑,我更喜欢另一个解析器,但是您的表单构建器与 XHTML 不兼容,因此我们不能将其作为纯 XML 处理。
DomDocument 有一个功能loadHTML
。这不介意一些未关闭的输入字段,只要它是有效的 HTML。
$html = '';
foreach ($fields as $field) {
$domDocument = new DomDocument();
$domDocument->loadHTML($field);
$html .= $domDocument->saveXML($domDocument->documentElement);
}
var_dump($html);
现在我们有了一个非常烦人的 DomDocument 功能。它会自动添加头部和身体标签。幸运的是,SO 上的其他一些聪明人知道如何处理这个问题。
https://stackoverflow.com/a/6953808/2314708(谢谢亚历克斯)
// remove <!DOCTYPE
$domDocument->removeChild($domDocument->firstChild);
// remove <html><body></body></html>
$domDocument->replaceChild($domDocument->firstChild->firstChild->firstChild, $domDocument->firstChild);
现在我们可以通过以下方式操作我们想要的元素:
// I am asuming there is only one element and that one element should be modified. if it is otherwise just use another selector.
$element = $domDocument->documentElement;
$element->appendChild(new DOMAttr("value", "someValue"));
当我们把所有这些放在一起时,我们就可以准确地创造出我们想要的东西。
//this would be in your DB or anywhere else.
$fields = array(
'<input id="test1">',
'<input id="test2">',
'<input id="test3" value="oldValue">',
'<input id="test4" value="oldValue">',
);
$values = array(
"test1" => 123, // set a new integer value
"test2" => "just a text", // set a new string value
"test3" => "newValue", // override an existing value
);
$domDocument = new DomDocument();
$html = '';
foreach ($fields as $field) {
$domDocument->loadHTML($field);
// now we have a very annoying functionality of DomDocument. It automatically adds head and body tags.
// remove <!DOCTYPE
$domDocument->removeChild($domDocument->firstChild);
// remove <html><body></body></html>
$domDocument->replaceChild($domDocument->firstChild->firstChild->firstChild, $domDocument->firstChild);
$element = $domDocument->documentElement;
$elementId = $element->getAttribute('id');
if (array_key_exists($elementId, $values)) {
// this adds an attribute or it overrides if it exists
$element->appendChild(new DOMAttr("value", $values[$elementId]));
}
$html .= $domDocument->saveXML($element);
}
var_dump($html);
对于您的单选框/复选框,您可以使用其他方式来选择您的元素,当然也可以设置正确的类型。基本上,它们的工作量与 JS 实现的工作量差不多,除非在服务器上执行此操作时不会惹恼用户的浏览器/系统。