我認爲最好的辦法例如,對於電子郵件中的表單元素可以被存儲爲一個字符串(單引號,以防止插值)將其加載到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功能。它會自動添加頭部和身體標籤。幸運的是其他一些智能傢伙也知道如何處理這個問題。 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實現一樣,採取一些簡單的工作,除非您在服務器上執行操作時不會煩擾用戶的瀏覽器/系統。
我不確定是否得到了它......例如,在數據庫中有一堆''標記。然後你把它全部抓起來,並相互追加一個,使表單HTML?你想能夠動態地添加/編輯一個'value'屬性嗎? – rmobis