Php替换顶部添加html的图像标记

时间:2016-07-07 10:53:18

标签: php html preg-replace

在php中我想用自定义网址替换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>

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

2 个答案:

答案 0 :(得分:2)

这是loadHTML()方法中的一个选项,用于删除HTML包装器:

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

http://php.net/manual/fr/domdocument.loadhtml.php

http://php.net/manual/fr/libxml.constants.php

答案 1 :(得分:0)

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

为了同时处理这两个场景,解决方法包括人为添加根元素(没有根元素,LIBXML无法正确构建DOM树):< / p>

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

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

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选项,不要添加假根元素并连接正文子节点:

$doc->loadHTML($img_tag);
...
$root = $doc->getElementsByTagName('body')->item(0);
$result = '';

foreach ($root->childNodes as $childNode)
    $result .= $doc->saveHTML($childNode);

return $result;

显然,对于已经包含html和body标签的文档,您无法使用此变通方法。