php DOMDocument: полное преобразование элемента формы? обертывание и удаление?

эй, ребята, $form держит это …

 <form method="post" action=""> <input type="hidden" name="ip" value="127.0.0.1"> <label for="s2email">Your Email</label> <input type="text" name="email" id="s2email" value="email..." size="20" onfocus="if (this.value == 'email...') {this.value = '';}" onblur="if (this.value == '') {this.value = 'email...';}"> <input type="submit" name="subscribe" value="Subscribe"> <input type="submit" name="unsubscribe" value="Unsubscribe"> </form> 

Поскольку я понятия не имею, что возможно с классом DOMDocument мне нужно обратиться за помощью. У меня на самом деле есть две вещи, которые мне нужно преобразовать в форме $ выше.

1.) label-s2email and its input#sd-email должны быть обернуты внутри <div class="name"> Возможно ли выбрать эти два (через id или для-атрибута) и обернуть эти два в div?

2.) Можно ли удалить атрибут onfocus и onblur с помощью php?

спасибо за помощь

Поскольку я не могу найти подходящий дубликат, который показывает, как обернуть узлы с помощью DOM , вот решение:

 // Setup DOMDocument and XPath $dom = new DOMDocument; $dom->loadHTML($form); $xpath = new DOMXPath($dom); // Create <DIV> with class attribute name $div = $dom->createElement('div'); $div->setAttribute('class', 'name'); // Find <input id="s2email"> and remove event attributes $input = $xpath->query('/html/body/form/input[@id="s2email"]')->item(0); $input->removeAttribute('onfocus'); $input->removeAttribute('onblur'); // Find <label for="s2email"> and insert new DIV before that $label = $xpath->query('/html/body/form/label[@for="s2email"]')->item(0); $label->parentNode->insertBefore($div, $label); // Move <label> and <input> into the new <div> $div->appendChild($label); $div->appendChild($input); // Echo the <form> outer HTML echo $dom->saveHTML($dom->getElementsByTagName('form')->item(0)); 

Вышеприведенный код будет воспроизводить ( live demo ):

 <form method="post" action=""> <input type="hidden" name="ip" value="127.0.0.1"><div class="name"> <label for="s2email">Your Email</label><input type="text" name="email" id="s2email" value="email..." size="20"> </div> <input type="submit" name="subscribe" value="Subscribe"><input type="submit" name="unsubscribe" value="Unsubscribe"> </form> 

Обратите внимание, что для передачи узла для saveHTML вам нужен PHP 5.3.6. Видеть

для возможных обходных решений до этого.

Леновым решением будет использование phpQuery или QueryPath, которые позволяют:

 print qp($html) ->find("*[onfocus], *[onblur]")->removeAttr("onblur")->removeAttr("onfocus") ->top()->find("label[for=s2email], input#s2email")->wrapAll("<div class='name'></div>") ->top("form")->xml(); 

Хотя в этом случае вы можете напрямую использовать DOMDocument. Там будет только более сложная часть. Это можно было бы упростить, если вы заключили <label> вокруг <input> вместо использования отношений for= и name= .