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 の非常に厄介な機能があります。head タグと body タグを自動的に追加します。幸いなことに、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 実装と同じくらい多くの作業が必要です。