Я думаю, что лучший способ будет загрузить его в 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);
для радио/флажков вы можете использовать другие способы выбора элемента и, конечно, установить правильный тип. В основном, они будут восприниматься как работа mutch как реализация JS, за исключением того, что вы не раздражаете браузер пользователя/систему, когда делаете это на сервере.
Я не уверен, получил ли я это ... У вас есть куча '' тегов, например, в вашей базе данных. Затем вы хватаете все это и добавляете друг к другу, чтобы сделать форму HTML? Вы хотите иметь возможность динамически добавлять/редактировать атрибут 'value' для этого? – rmobis