首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP函数添加额外的<p> <html>和<body>标记

PHP函数添加额外的<p> <html>和<body>标记
EN

Stack Overflow用户
提问于 2017-09-27 17:31:53
回答 2查看 1.2K关注 0票数 0

我使用以下功能向桌面和移动用户显示不同的图像,具体取决于他们的设备。

我的index.php文件

代码语言:javascript
运行
复制
<!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>标记。

我的输出图像

我的输出源代码

代码语言:javascript
运行
复制
<!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>标记?

更新

按照@ <br/>标签的建议进行更新。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-27 17:53:18

您输出的内容是通过DOMDocument的saveHTML方法生成的:

代码语言:javascript
运行
复制
$content = $dom->saveHTML($root);

这里引用根节点,它是documentElement,然后是不想输出的<html>元素的父元素。因此,选择要输出的正确元素,例如文档的正文。

代码语言:javascript
运行
复制
$body = $doc->getElementsByTagName('body')->item(0);

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

echo $content;

在您的例子中,我认为使用的不是<body>元素,而是第一个<p>元素。

对于一些相关的案例,可能需要采取不同的方法,这里还提供了关于该主题的补充问答材料:

票数 2
EN

Stack Overflow用户

发布于 2019-08-09 20:42:32

似乎DOMDocument总是需要一个根标记,所以如果您放置原始文本而没有任何父标记,DOMDocument会隐式地添加它(因此some text变成了<p>some text</p>)。我认为最好的方法是显式地添加根标记,并从saveHTML()结果中删除它们:

代码语言:javascript
运行
复制
$dom->loadHTML(
    '<html><body>' . $html . '</body></html>',
    LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED
);

// do your stuff

$result = str_replace(['<html><body>', '</body></html>'], '', $dom->saveHTML());
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46453940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档