Php 用DOMDocument替换并返回部分HTML,而不添加body、doctype等
我想对部分文档HTML文档进行一些替换。比方说,我想在Php 用DOMDocument替换并返回部分HTML,而不添加body、doctype等,php,html,laravel,domdocument,Php,Html,Laravel,Domdocument,我想对部分文档HTML文档进行一些替换。比方说,我想在img标记的src参数上添加一些东西 (示例)替换: 你好 作者: 你好 我确实想使用DOMDocument来实现这一点,所以我编写了如下代码: $doc = new \DOMDocument( '1.0', 'utf-8'); $doc->loadHTML('<p>hello</p><img src="REPLACE" /><p></p>'); $tags = $doc-
img
标记的src
参数上添加一些东西
(示例)替换:
你好
作者:
你好
我确实想使用DOMDocument来实现这一点,所以我编写了如下代码:
$doc = new \DOMDocument( '1.0', 'utf-8');
$doc->loadHTML('<p>hello</p><img src="REPLACE" /><p></p>');
$tags = $doc->getElementsByTagName('img');
foreach ($tags as $tag) {
$tag->setAttribute('src', 'http://example.org/image.jpeg');
}
var_dump($doc->saveHTML());
$doc=new\DOMDocument('1.0','utf-8');
$doc->loadHTML(“hello”);
$tags=$doc->getElementsByTagName('img');
foreach($tags作为$tag){
$tag->setAttribute('src','http://example.org/image.jpeg');
}
变量转储($doc->saveHTML());
但它的回报是:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<p>hello</p><img src="http://example.org/image.jpeg"><p></p>
</body></html>
你好
此返回有几个问题:
- 它使用了一个奇怪的doctype:
李>HTML4.0
- 它确实添加了doctype、html标记和body标记
旁注:我用的是Laravel,所以如果Laravel有现成的东西,那也太棒了 您可以使用中提供的额外选项来实现您的目标。检查
选项
参数。关于libxml常量的详细信息。请注意,它是从PHP5.4开始提供的。比如:
...
$doc->loadHTML('<p>hello</p><img src="REPLACE" /><p></p>',
LIBXML_HTML_NOIMPLIED |
LIBXML_HTML_NODEFDTD);
...
$doc->saveHTML();
。。。
$doc->loadHTML(“你好””,
LIBXML_HTML_noimpled|
LIBXML_HTML_NODEFDTD);
...
$doc->saveHTML();
更新
如果您看到UTF-8字符被更改为一些奇数字符,则使用可以解决此问题,如:
$doc->loadHTML(
mb_convert_encoding('<p>hello</p><img src="REPLACE" /><p></p>', 'HTML-ENTITIES', 'UTF-8'),
LIBXML_HTML_NOIMPLIED |
LIBXML_HTML_NODEFDTD
);
$doc->loadHTML(
mb_convert_编码(“hello”、“HTML-ENTITIES”、“UTF-8”),
LIBXML_HTML_noimpled|
LIBXML\u HTML\u NODEFDTD
);
如果你想使用laravel选项,你可以调用你拥有的部分,让它为你返回html:
$src = "http://example.org/image.jpeg"
return view('path_to_partial', compact('src'))->render();
谢谢,这很有效!但它仍然破坏了我的utf8,用一些字符替换了它。也有这样的选择吗?(很抱歉,它不在OP中)@rap-2-h您可以尝试以下方式:$doc->loadHTML(mb_convert_编码(“hello”、“HTML-ENTITIES”、“UTF-8”)、LIBXML_HTML_noimpled | LIBXML_HTML_NODEFDTD);可能重复的
$doc->loadHTML(
mb_convert_encoding('<p>hello</p><img src="REPLACE" /><p></p>', 'HTML-ENTITIES', 'UTF-8'),
LIBXML_HTML_NOIMPLIED |
LIBXML_HTML_NODEFDTD
);
$src = "http://example.org/image.jpeg"
return view('path_to_partial', compact('src'))->render();