Bir php DOMElement değiştirme innerHTML

5 Cevap php

Bir php DOMElement bir innerHTML Nasıl Değiştirilir?

5 Cevap

Geçenlerde bir proje için bunu yapmak için gerekli ve DOMElement bir uzantısı ile sona erdi: http://www.keyvan.net/2010/07/javascript-like-innerhtml-access-in-php/

İşte nasıl kullanıldığını gösteren bir örnek:

<?php
require_once 'JSLikeHTMLElement.php';
$doc = new DOMDocument();
$doc->registerNodeClass('DOMElement', 'JSLikeHTMLElement');
$doc->loadHTML('<div><p>Para 1</p><p>Para 2</p></div>');
$elem = $doc->getElementsByTagName('div')->item(0);

// print innerHTML
echo $elem->innerHTML; // prints '<p>Para 1</p><p>Para 2</p>'

// set innerHTML
$elem->innerHTML = '<a href="http://fivefilters.org">FF</a>';

// print document (with our changes)
echo $doc->saveXML();
?>

Ben yapabileceğiniz en iyi şey, bunu kopyalamak, innerHTML değiştirmek istediğiniz DOMElement alır ve yerine bir işlev ile gelip düşünüyorum.

Çok kaba PHP:

function replaceElement($el, $newInnerHTML) {
    $newElement = $myDomDocument->createElement($el->nodeName, $newInnerHTML);
    $el->parentNode->insertBefore($newElement, $el);
    $el->parentNode->removeChild($el);

    return $newElement;
}

Bu hesap nitelikleri ve iç içe geçmiş yapıların içine almaz, ama bu yolda size alacak düşünüyorum.

Bu kütüphane PHP bakabilirsiniz Basit HTML DOM Parser http://simplehtmldom.sourceforge.net/

Bu oldukça basit görünüyor. Eğer elemanların innertext özellik değiştirebilirsiniz. Bu yardımcı olabilir.

Burada bir ben yazdım sınıf fonksiyonu ile değiştirin:

Bir sınıfın InnerHtml yerini alacak. Ayrıca düğüm türü örneğin belirtebilirsiniz. div / p / a vb

function replaceInnerHtmlByClass($html, $replace=null, $class=null, $nodeType=null){
  if(!$nodeType){ $nodeType = '*'; }
  $dom = new DOMDocument();
  $dom->loadHTML($html);
  $xpath = new DOMXPath($dom);
  $nodes = $xpath->query("//{$nodeType}[contains(concat(' ', normalize-space(@class), ' '), '$class')]");
  foreach($nodes as $node) {
    while($node->childNodes->length){
      $node->removeChild($node->firstChild);
    }
    $fragment = $dom->createDocumentFragment();
    $fragment->appendXML($replace);
    $node->appendChild($fragment);
  }
  return $dom->saveHTML($dom->documentElement);
}

Burada belirli bir sınıfa düğümleri kaldırmak ancak iç html koruyarak yazdı başka bir fonksiyonudur.

True yerine ayarlama iç html atar.

Başka herhangi bir içerik yerine ayarlama sağlanan içeriği ile iç html yerini alacak.

function stripTagsByClass($html, $class=null, $nodeType=null, $replace=false){
  if(!$nodeType){ $nodeType = '*'; }
  $dom = new DOMDocument();
  $dom->loadHTML($html);
  $xpath = new DOMXPath($dom);
  $nodes = $xpath->query("//{$nodeType}[contains(concat(' ', normalize-space(@class), ' '), '$class')]");
  foreach($nodes as $node) {
    $innerHTML = '';
    $children = $node->childNodes;
    foreach($children as $child) {
      $tmp = new DOMDocument();
      $tmp->appendChild($tmp->importNode($child,true));       
      $innerHTML .= $tmp->saveHTML();
    }
    $fragment = $dom->createDocumentFragment();
    if($replace !== null && $replace !== false){
      if($replace === true){ $replace = ''; }
      $innerHTML = $replace;
    }
    $fragment->appendXML($innerHTML);
    $node->parentNode->replaceChild($fragment, $node);
  }
  return $dom->saveHTML($dom->documentElement);
}

Tezler fonksiyonları kolayca seçici olarak diğer özelliklerini kullanmak için adapte edilebilir.

Ben sadece sınıf niteliğini değerlendirmek için gereklidir.

Örneğin 3 düzeyleri ile XML eklemek çalışırsanız - Bu appendXML her zaman işe yaramaz gibi görünüyor. İşte ben ($ elemana innerHTML $ olarak içeriğini ayarlamak istediğiniz) her zaman işe yazdı fonksiyonudur:

function setInnerHTML($DOM, $element, $content) {
    $DOMInnerHTML = new DOMDocument();
    $DOMInnerHTML->loadHTML($content);
    $contentNode = $DOMInnerHTML->getElementsByTagName('body')->item(0)->firstChild;
    $contentNode = $DOM->importNode($contentNode, true);
    $element->appendChild($contentNode);
    return $elementNode;
}