【问题标题】:Php replace image tag adding html at the topphp替换图像标签在顶部添加html
【发布时间】:2016-07-07 10:53:18
【问题描述】:

在 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>

我只想要正文中的内容。不是整个 html。

【问题讨论】:

  • 为什么你所有的html属性都有两对引号'"...."'

标签: php html preg-replace


【解决方案1】:

这是 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

【讨论】:

    【解决方案2】:

    如果您使用 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 和 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-&gt;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 和 body 标签的文档使用此解决方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多