Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用DOMDocument替换并返回部分HTML,而不添加body、doctype等_Php_Html_Laravel_Domdocument - Fatal编程技术网

Php 用DOMDocument替换并返回部分HTML,而不添加body、doctype等

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-

我想对部分文档HTML文档进行一些替换。比方说,我想在
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标记
我知道DOMDocument添加doctype、html和body标记是“正常的”,但是我可以避免这种情况吗?是否有任何方法可以“仅仅”恢复我的HTML切片,而只使用我执行的替换?使用正则表达式不是一种选择,因为到处都有帖子说这是一种不好的做法


旁注:我用的是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();