appendXML, удаляющий элемент img - PullRequest
0 голосов
/ 31 октября 2018

Мне нужно вставить изображение с элементом div в середине статьи. Страница генерируется с использованием PHP из CRM. У меня есть процедура для подсчета символов для всех тегов абзаца и вставки HTML после абзаца, который имеет 120-й символ. Я использую appendXML, и это работает, пока я не попытаюсь вставить элемент изображения.

Когда я вставляю элемент <img>, он удаляется. Я понимаю, что он ищет XML, однако закрываю тег <img>, который, как я понял, поможет.

Есть ли способ использовать appendXML, а не удалять элементы img?

$mcustomHTML = "<div style="position:relative; overflow:hidden;"><a href="https://example.com/code=123456"><img src="https://s3.amazonaws.com/a.example.com/image.png" alt="No image" /></img></a></div>";

$doc = new DOMDocument();
$doc->loadHTML('<?xml encoding="utf-8" ?>' . $content);        

// read all <p> tags and count the text until reach character 120        
// then add the custom html into current node
$pTags = $doc->getElementsByTagName('p');
foreach($pTags as $tag) {
    $characterCounter += strlen($tag->nodeValue);
    if($characterCounter > 120) {
        // this is the desired node, so put html code here
        $template = $doc->createDocumentFragment();
        $template->appendXML($mcustomHTML);
        $tag->appendChild($template);
        break;
    }
}
return $doc->saveHTML();

1 Ответ

0 голосов
/ 31 октября 2018

Это должно работать для вас. Он использует временный документ DOM для преобразования имеющейся у вас HTML-строки в нечто работоспособное. Затем мы импортируем содержимое временного документа в основной. После того, как он импортирован, мы можем просто добавить его, как любой другой узел.

<?php
$mcustomHTML = '<div style="position:relative; overflow:hidden;"><a href="https://example.com/code=123456"><img src="https://s3.amazonaws.com/a.example.com/image.png" alt="No image" /></a></div>';
$customDoc = new DOMDocument();
$customDoc->loadHTML($mcustomHTML, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

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

$customImport = $doc->importNode($customDoc->documentElement, true);

// read all <p> tags and count the text until reach character 120        
// then add the custom html into current node
$pTags = $doc->getElementsByTagName('p');
foreach($pTags as $tag) {
    $characterCounter += strlen($tag->nodeValue);
    if($characterCounter > 120) {
        // this is the desired node, so put html code here
        $tag->appendChild($customImport);
        break;
    }
}
return $doc->saveHTML();
...