在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。
答案 0 :(得分:2)
这是loadHTML()方法中的一个选项,用于删除HTML包装器:
$doc->loadHTML($img_tag, , LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
答案 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_NOIMPLIED
和LIBXML_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标签的文档,您无法使用此变通方法。