html5 — функция PHP DOM, добавляющая дополнительный тег & lt; p & gt; & Lt; & HTML GT; и & lt; body & gt; теги

Я использую следующую функцию, чтобы показать другое изображение для пользователя на рабочем столе и на мобильном устройстве в зависимости от их устройства.

Мой файл index.php

<!DOCTYPE html>
<html class="no-js" lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Testing Page</title>
</head>
<body>
<?php
define("DEVICE", "desktop");
ob_start();
?>
<?php echo 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' . '<br/>'?>
<?php echo 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' . '<br/>'?>
<?php echo 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' . '<br/>'?>
<?php echo 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' . '<br/>'?>
<?php echo 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' . '<br/>'?>
<?php echo 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' . '<br/>'?>
<div>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<img src="/desktop-img/blog-1.png" alt="blog-1">
<img src="/desktop-img/blog-2.png" alt="blog-2">
<img src="/desktop-img/blog-3.png" alt="blog-3">
</div>
<?php
// Assign bufferred content to a variable for further processing
$content = ob_get_clean();

// Device specific images
function selectPaths($tag){

// If paths is wrapped in <pre> or <code> tags
if($tag->nodeName=="pre" || $tag->nodeName=="code"){
return;
// If not wrapped witihn <pre> or <code> tags
} elseif($tag->nodeName=="img"){
// Replace device specific path
$tag->attributes->getNamedItem("src")->nodeValue=str_replace('desktop-img', DEVICE . '-img',$tag->attributes->getNamedItem("src")->nodeValue);
} elseif($tag->hasChildNodes()){
foreach($tag->childNodes as $child){
selectPaths($child);
}
}
}

function deviceImages($content){

$dom=new DOMDocument;
$dom->preserveWhiteSpace=true;
libxml_use_internal_errors(true);
$dom->loadHTML($content);
libxml_clear_errors();
$root=$dom->documentElement;
selectPaths($root);
$dom->formatOutput=false;
//Assign to variable
$content = $dom->saveHTML($root);
return $content;
}
$content = deviceImages ($content);
?>
<div id='wrapper'>
<?php echo $content; ?>
</div>
</body>
</html>

Моя задача:

Эта функция добавляет <p> тег, а также и дополнительные <html><body> теги к моему выводу.

Мое выходное изображение
введите описание изображения здесь

Мой вывод Исходный код

<!DOCTYPE html>
<html class="no-js" lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Testing Page</title>
</head>
<body>
<div id='wrapper'>
<html><body>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br></p>
<div>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
<img src="/desktop-img/blog-1.png" alt="blog-1"><img src="/desktop-img/blog-2.png" alt="blog-2"><img src="/desktop-img/blog-3.png" alt="blog-3">
</div>
</body></html></div>
</body>
</html>

Мой выходной исходный код изображения

введите описание изображения здесь

Мой вопрос:

Как я могу избежать этого <p> <html> а также <body> теги?

ОБНОВЛЕНО

Обновлено в соответствии с предложением @Aknosis о <br/> теги.

0

Решение

Выводимое вами содержимое генерируется с помощью метода saveHTML в DOMDocument:

$content = $dom->saveHTML($root);

Здесь вы ссылаетесь на корневой узел, который является documentElement, который затем является родительским элементом этого <html> элемент, который вы не хотите выводить. Поэтому выберите правильный элемент для вывода, например, тело этого документа.

$body = $doc->getElementsByTagName('body')->item(0);

$content = implode(
"",
array_map([$doc, 'saveHTML'], iterator_to_array($body->childNodes))
);

echo $content;

В твоем случае я думаю вместо <body> элемент вы берете первый <p> элемент.

Для некоторых связанных случаев может потребоваться другой подход, также есть дополнительная Q&Материал здесь на сайте по этой теме:

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector