Заменить контент-тег HTML, используя PHP - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть HTML-код:

<div>
   <h1>Header</h1>
   <code><p>First code</p></code>
   <p>Next example</p>
   <code><b>Second example</b></code>
</div>

Используя PHP, я хочу заменить все < символы, расположенные в code элементах, например, для приведенного выше кода, который я хочу преобразовать в:

<div>
   <h1>Header</h1>
   <code>&lt;p>First code&lt;/p></code>
   <p>Next example</p>
   <code>&lt;b>Second example&lt;/b></code>
</div>

Я пытаюсь использовать класс PHP DomDocument, но моя работа оказалась неэффективной. Ниже мой код:

$dom = new DOMDocument();
$dom->loadHTML($content);

$innerHTML= '';
$tmp = '';
if(count($dom->getElementsByTagName('*'))){
    foreach ($dom->getElementsByTagName('*') as $child) {

        if($child->tagName == 'code'){
            $tmp = $child->ownerDocument->saveXML( $child);
            $innerHTML .= htmlentities($tmp);
        }
        else{
            $innerHTML .= $child->ownerDocument->saveXML($child);
        }
    }
}

1 Ответ

0 голосов
/ 19 ноября 2018

Итак, вы правильно перебираете разметку, и использование saveXML() было близко к тому, что вы хотите, но нигде в вашем коде вы не пытаетесь реально изменить содержимое элемента.Это должно работать:

<?php
$content='<div>
   <h1>Header</h1>
   <code><p>First code</p></code>
   <p>Next example</p>
   <code><b>Second example</b></code>
</div>';
$dom = new DOMDocument();
$dom->loadHTML($content, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
foreach ($dom->getElementsByTagName('code') as $child) {
    // get the markup of the children
    $html = implode(array_map([$child->ownerDocument,"saveHTML"], iterator_to_array($child->childNodes)));
    // create a node from the string
    $text = $dom->createTextNode($html);
    // remove existing child nodes
    foreach ($child->childNodes as $node) {
        $child->removeChild($node);
    }
    // append the new text node - escaping is done automatically
    $child->appendChild($text);
}
echo $dom->saveHTML();
...