如何更改php DOMElement的innerHTML?更改php DOMElement的innerHTML
回答
看一看這個庫PHP簡單的HTML DOM解析器http://simplehtmldom.sourceforge.net/
它看起來非常簡單。您可以更改您的元素的innertext
屬性。它可能有幫助。
PHP,而不是JavaScript .. PHP的DOM實現沒有'innerHTML'屬性。 – 2010-05-06 03:04:56
是的,我的錯。但php5的HTML DOM解析器有'innertext'。 http://simplehtmldom.sourceforge.net/ – Jull 2010-05-06 03:11:07
這不是OP所指的圖書館。見:http://php.net/manual/en/book.dom.php但你可以編輯你的答案,並鏈接到你找到的庫,看看OP是否要切換。 – 2010-05-06 03:54:18
我認爲你可以做的最好的事情是拿出一個函數,它將採用你想要更改InnerHTML的DOMElement,將其複製並替換它。
在非常粗糙的PHP:
function replaceElement($el, $newInnerHTML) {
$newElement = $myDomDocument->createElement($el->nodeName, $newInnerHTML);
$el->parentNode->insertBefore($newElement, $el);
$el->parentNode->removeChild($el);
return $newElement;
}
這並沒有考慮到的屬性和嵌套結構,但我認爲這將讓你對你的方式。
我需要最近的一個項目做到這一點,結束了一個延伸到一個DOMElement:http://www.keyvan.net/2010/07/javascript-like-innerhtml-access-in-php/
這裏是展示它是如何使用的例子:
<?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();
?>
這裏是一個由類函數我更換剛纔寫道:
它會替換class的innerHtml。您還可以指定節點類型,例如。 DIV/P/A等
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);
}
這裏是另一個函數我寫信給刪除節點與特定的類,但保留了內部HTML。
將replace設置爲true會丟棄內部html。
設置替換爲任何其他內容將取代內部的HTML與提供的內容。
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);
}
這些函數可以很容易地適用於使用其他屬性作爲選擇器。
我只需要它來評估類的屬性。
似乎appendXML並不總是工作 - 例如,如果您嘗試追加3級的XML。下面是我寫的總是工作(您想設置$內容innerHTML來$元素)的功能:
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;
}
返回的變量'$ elementNode'未定義 - 不應該是'$ contentNode'嗎? 您可以使用'$ element-> ownerDocument'來簡化函數,而不必傳入'$ DOM'。 這隻會導入任何$ content包含的第一個孩子。要導入整個片段,請刪除第4行的' - > firstChild'。 – 2016-01-01 11:25:50
這裏是你如何做到這一點:
$doc = new DOMDocument('');
$label = $doc->createElement('label');
$label->appendChild($doc->createTextNode('test'));
$li->appendChild($label);
echo $doc->saveHTML();
從喬安娜九策的回答發展上時,該功能將插入一個文本節點或HTML片段:
function nodeFromContent($node, $content) {
//creates a text node, or dom node if content contains html
$lt = strpos($content, '<');
$gt = strrpos($content, '>');
if (!($lt === false || $gt === false) && $gt > $lt) {
//< followed by > means potentially contains HTML
$DOMInnerHTML = new DOMDocument();
$DOMInnerHTML->loadHTML($content);
$contentNode = $DOMInnerHTML->getElementsByTagName('body')->item(0);
$newNode = $node->ownerDocument->importNode($contentNode, true);
} else {
$newNode = $node->ownerDocument->createTextNode($content);
}
return $newNode;
}
用法
$newNode = nodeFromContent($node, $content);
$node->parentNode->insertBefore($newNode, $node);
//or $node->appendChild($newNode) depending on what you require
function setInnerHTML($DOM, $element, $innerHTML) {
$node = $DOM->createTextNode($innerHTML);
$element->appendChild($node);
}
另一種解決方案:
1)創建新DOMDocumentFragment從HTML要插入的字符串; 2)刪除我們元素的舊內容,刪除它的子節點; 3)將DOMDocumentFragment附加到我們的元素。
function setInnerHTML($element, $html)
{
$fragment = $element->ownerDocument->createDocumentFragment();
$fragment->appendXML($html);
while ($element->hasChildNodes())
$element->removeChild($element->firstChild);
$element->appendChild($fragment);
}
或者,我們可以用它代替clean copy我們的元素,然後追加DOMDocumentFragment這個克隆。
function setInnerHTML($element, $html)
{
$fragment = $element->ownerDocument->createDocumentFragment();
$fragment->appendXML($html);
$clone = $element->cloneNode(); // Get element copy without children
$clone->appendChild($fragment);
$element->parentNode->replaceChild($clone, $element);
}
測試:
$doc = new DOMDocument();
$doc->loadXML('<div><span style="color: green">Old HTML</span></div>');
$div = $doc->getElementsByTagName('div')->item(0);
echo $doc->saveHTML();
setInnerHTML($div, '<p style="color: red">New HTML</p>');
echo $doc->saveHTML();
// Output:
// <div><span style="color: green">Old HTML</span></div>
// <div><p style="color: red">New HTML</p></div>
雖然此代碼段可能會解決問題,[包括解釋](// meta。stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高您的帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要用解釋性註釋來擠佔代碼,這會降低代碼和解釋的可讀性! – 2016-08-07 15:11:06
我最終使使用的一些功能從其他人在此頁上該功能。我從更改了一個,喬安娜Goch的方式,彼得品牌大多說,並且還添加了一些代碼來賓和從其他地方。
該函數不使用擴展名,也不使用appendXML(即使它看到一個未關閉的BR標籤,它也是非常挑剔和破壞的)並且看起來運行良好。
function set_inner_html($element, $content) {
$DOM_inner_HTML = new DOMDocument();
$internal_errors = libxml_use_internal_errors(true);
$DOM_inner_HTML->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'));
libxml_use_internal_errors($internal_errors);
$content_node = $DOM_inner_HTML->getElementsByTagName('body')->item(0);
$content_node = $element->ownerDocument->importNode($content_node, true);
while ($element->hasChildNodes()) {
$element->removeChild($element->firstChild);
}
$element->appendChild($content_node);
}
- 1. 變化的innerHTML可可一個DOMElement
- 2. Frameset innerHTML更改
- 3. 在php錯誤中更改innerHTML
- 4. 如何使用PHP更改innerHTML?
- 5. 從外部php文件更改innerHTML
- 6. innerHTML更改文本
- 7. 將innerHTML更改爲
- 8. 更改innerHTML()方法?
- 9. InnerHTML的JQuery更改事件
- 10. 如何更改的innerHTML
- 11. 更改變量中的innerHTML?
- 12. 有沒有更好的方式來更改PHP中的DOMElement-> tagName屬性?
- 13. JavaScript - 如何更改innerHTML
- 14. 按鈕單擊更改innerHTML
- 15. 當您更改innerHTML屬性
- 16. 更改innerHTML onmousemove事件
- 17. 如何擴展PHP DOMElement?
- 18. PHP DOMElement是不可變的。 ='沒有修改允許的錯誤'
- 19. 根據輸入的值更改的innerHTML
- 20. 更改動態設置的innerHTML
- 21. javascript或jquery更改div的innerHTML?
- 22. 更改JavaScript中的innerHTML刪除鏈接
- 23. 如何在JavaScript中更改DOM的innerHTML
- 24. 不能更改span類的InnerHTML?
- 25. 更改鏈接上的innerHTML編號
- 26. 更改沒有ID的href innerHTML?
- 27. jquery更改P的innerhtml不工作
- 28. 更改innerhtml輸入框的值
- 29. 更改innerHTML後更改contenteditable div中的光標位置
- 30. PHP的DOMDocument更換一個DOMElement孩子HTML字符串
你不能,直接。你必須有一箇中間函數來接收一個字符串並把它變成一個DOMElement數組。你可以自己寫,儘管我確信網絡上存在類似的東西。 – 2010-05-06 03:06:25
在php DOMElement類中沒有innerHTML屬性。嘗試尋找這裏:http://php.net/manual/en/class.domelement.php和在這裏:http://www.php.net/manual/en/class.domtext.php – Babiker 2010-05-06 03:39:21