Php 替换图像标签,在顶部添加 html


Php replace image tag adding html at the top

在php中,我想用我的自定义URL替换html中的图像src。为此,我做了这样的函数

function replace_img_src($img_tag) {
    $doc = new DOMDocument();
    $doc->loadHTML($img_tag);
    $tags = $doc->getElementsByTagName('img');
    foreach ($tags as $tag) {
        $old_src = $tag->getAttribute('src');
        $new_url = rawurlencode($old_src);
        $new_src_url = get_template_directory_uri() . '/img.php?img='.$new_url;
        $tag->setAttribute('src', $new_src_url);
    }
    return $doc->saveHTML();
}

它工作正常,但它像这样返回总 HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p class=''"'"'>hello world</p><div class=''"medium-insert-images'"'><img src="http://test.com/dev/projects/newatarlife/wp-content/themes/atarlife/img.php?img=%5C%22https%3A%2F%2Fpixabay.com%2Fget%2Feb32b40620f41c2ad65a5854e44a4092e27fe5c818b517469df8c97ba5ee_640.jpg%5C%22"></div><div class=''"medium-insert-buttons'"' contenteditable=''"false'"' style=''"left:' top: display: none>
    <a class=''"medium-insert-buttons-show'"'> </a>
    <ul class=''"medium-insert-buttons-addons'"' style=''"display:' none><li><a data-addon=''"images'"' data-action=''"add'"' class=''"medium-insert-action'"'><span class=''"fa' fa-camera></span></a></li>
            <li><a data-addon=''"embeds'"' data-action=''"add'"' class=''"medium-insert-action'"'><span class=''"fa' fa-youtube-play></span></a></li>
    </ul></div></body></html>

我只想要体内的内容。不是整个网页。

这里是

loadHTML() 方法中的一个选项来摆脱 HTML 包装器:

$doc->loadHTML($img_tag, , LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

https://php.net/manual/domdocument.loadhtml.php

https://php.net/manual/libxml.constants.php

如果您正在使用 html 部件(即:不是包含 DTD 和 html、body 标签的整个页面),则有两种可能的情况:有一个包含所有其他节点的根元素,或者没有根元素。

为了同时处理这两种情况,解决方法包括人为地添加一个根元素(如果没有根元素,LIBXML 无法正确构建 DOM 树):

$doc = new DOMDocument();
$doc->loadHTML('<div>' . $img_tag . '</div>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

LIBXML_HTML_NOIMPLIED阻止自动添加 html 和正文元素。

LIBXML_HTML_NODEFDTD阻止添加 DTD。(这个不是真的需要)

注意:有时未定义常量LIBXML_HTML_NOIMPLIEDLIBXML_HTML_NODEFDTD。在这种情况下,您可以在之前自行定义它们,也可以将它们替换为它们的值 8192 和 8。或者你可以直接把两个值的总和:8200。

然后要返回你想要的 html(没有假根元素),你需要连接所有根元素子节点:

$result = '';
foreach($doc->documentElement->childNodes as $childNode)
    $result .= $doc->saveHTML($childNode);
return $result;

$doc->documentElement是定位根元素的便捷方法。


其他可能性:不要使用 LIBXML_HTML_NOIMPLIED 选项,不要添加假根元素并连接 body 子节点:

$doc->loadHTML($img_tag);
...
$root = $doc->getElementsByTagName('body')->item(0);
$result = '';
foreach ($root->childNodes as $childNode)
    $result .= $doc->saveHTML($childNode);
return $result;

显然,您不能将此解决方法用于已经具有 html 和正文标记的文档。