Как изменить innerHTML php DOMElement?Изменение innerHTML php DOMElement
ответ
Посмотрите на эту библиотеку PHP Simple HTML DOM Parser http://simplehtmldom.sourceforge.net/
Это выглядит довольно просто. Вы можете изменить innertext
свойство ваших элементов. Это может помочь.
PHP, а не JavaScript .. PHP-реализация DOM не имеет свойства 'innerHTML'. –
Да, моя вина. но php5 HTML DOM parser имеет «внутренний текст». http://simplehtmldom.sourceforge.net/ – Jull
Это не библиотека, на которую ссылался OP. См .: http://php.net/manual/en/book.dom.php. Но вы можете отредактировать свой ответ и ссылку на найденную библиотеку и посмотреть, хочет ли OP переключиться. –
Я думаю, что самое лучшее, что вы можете сделать, это придумать функцию, которая возьмет DOMElement, который вы хотите изменить InnerHTML, скопируйте и замените.
В очень грубом PHP:
function replaceElement($el, $newInnerHTML) {
$newElement = $myDomDocument->createElement($el->nodeName, $newInnerHTML);
$el->parentNode->insertBefore($newElement, $el);
$el->parentNode->removeChild($el);
return $newElement;
}
Это не принимает во внимание атрибутов и вложенных структур, но я думаю, что это поможет вам на вашем пути.
Для кого-то еще, проверяющего этот код, мне пришлось использовать $ el-> parentNode-> insertBefore вместо $ el-> insertBefore. – whichdan
Это работает для установки innerText не innerHTML. Второй параметр createElement не принимает форматирование html. – Greg
Согласен, @greg. Это будет кодировать символы HTML. – Kafoso
мне нужно сделать это для проекта в последнее время и в конечном итоге с расширением до 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();
?>
Вот заменить классом функции I просто написал (а):
Он заменит innerHtml класса. Вы также можете указать тип узла, например. DIV/р/а и т.д.
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.
Установка замены на истину будет отбрасывать внутренний 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 не работает всегда - например, если вы попытаетесь добавить XML с 3 уровнями.Вот функция, я писал, что всегда работает (вы хотите установить $ содержание, как 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'. Это импортирует только первый дочерний элемент любого содержимого. Чтобы импортировать весь фрагмент, удалите '-> firstChild 'в строке 4. –
вот как вы это делаете:
$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) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. Также попробуйте не толковать код с пояснительными комментариями, что уменьшает читаемость кода и объяснений! –
Я закончил тем, что делает эту функцию с помощью нескольких функций от других людей на этой странице. Я изменил один из Joanna Goch так, что Peter Brand говорит в основном, а также добавил код от Гость и из других мест.
Эта функция не использует расширение и не использует 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. PHP: DomElement-> getAttribute
- 3. php DOMElement appendchild
- 4. Изменение innerHTML из внешнего php-файла
- 5. PHP DOMElement, замена текст узла
- 6. Отправить тело DOMElement другому php
- 7. php DOMElement appendChild нежелательное вложение
- 8. PHP Вызов неопределенного метода DOMElement
- 9. PHP DOMElement getElementsByTagName специфический селектор
- 10. DOMNode к DOMElement в PHP
- 11. Расширение DOMElement
- 12. innerHTML и изменение цвета
- 13. Изменение innerHTMl, сохраняя CSS
- 14. Javascript изменение innerhtml
- 15. innerHTML изменение javascript
- 16. Изменение innerHTML изнутри ячейки
- 17. Изменение innerHtml From Iframe
- 18. Javascript: Изменение innerHTML vs display
- 19. Изменение IFrames InnerHtml из codebehind
- 20. Родитель запроса DOMElement - XPath
- 21. как отобразить объект класса DOMElement в PHP
- 22. PHP: получить все объявленные пространства имен DOMElement
- 23. Получить DOMElement с определенным текстом PHP/XPath
- 24. Как я могу расширить PHP DOMElement?
- 25. Расширение DOMElement в PHP с помощью registerNodeClass
- 26. Конструктор не вызвал расширенный PHP DOMElement
- 27. php domelement - запустить метод на вставке?
- 28. PHP, DOMElement получить значение только текущий узел
- 29. Вызов неопределенной метод DOMElement :: appendChid() в PHP
- 30. преобразовать строку в domelement в php
Вы не можете напрямую. Вы должны будете иметь промежуточную функцию, чтобы взять строку и превратить ее в массив DOMElements. Вы могли бы написать это самостоятельно, хотя я уверен, что что-то подобное существует в Интернете. –
В PHP классе DOMElement нет свойства innerHTML. Попробуйте посмотреть здесь: http://php.net/manual/en/class.domelement.php и здесь: http://www.php.net/manual/en/class.domtext.php – Babiker