php DOMDocument:表单元素的完整转换?包装和删除?

时间:2011-03-24 09:13:00

标签: php domdocument wrapping

嘿伙计们, $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或for-attribute)并将这两个包装成div?

2.。)是否可以使用php删除onfocus和onblur属性?

谢谢你的帮助

2 个答案:

答案 0 :(得分:2)

由于我找不到合适的副本来展示如何使用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。参见

之前可能的解决方法。

答案 1 :(得分:0)

懒惰的解决方案是使用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=关系,则可以简化此操作。