【问题标题】:Replace and return partial HTML with DOMDocument without adding body, doctype, etc用 DOMDocument 替换和返回部分 HTML,而不添加 body、doctype 等
【发布时间】:2017-07-10 17:46:40
【问题描述】:

我想对部分文档 HTML 文档进行一些替换。假设,我想在img 标签的src 参数上添加一些内容。

(示例)替换:

<p>hello</p><img src="REPLACE" /><p></p>

作者:

<p>hello</p><img src="http://example.org/image.jpeg" /><p></p>

我确实想使用 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());

但它会返回:

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

这个返回有几个问题:

  • 它使用了一个奇怪的文档类型:HTML 4.0!
  • 它确实添加了一个 doctype、一个 html 标签和一个 body 标签。

我知道 DOMDocument 添加 doctype、html 和 body 标签是“正常的”,但是我可以避免这种情况吗?无论如何“只是”恢复我的 HTML 切片,只用我执行的替换?使用正则表达式不是一种选择,因为到处都有帖子说这是不好的做法。

旁注:我使用 Laravel,所以如果 Laravel 有开箱即用的东西,它也可能很棒!

【问题讨论】:

标签: php html laravel domdocument


【解决方案1】:

您可以使用loadHTML() 中提供的额外选项来实现您想要的。检查options 参数。有关 libxml 常量 here 的详细信息。请注意,它从 PHP 5.4 开始可用。喜欢:

...
$doc->loadHTML('<p>hello</p><img src="REPLACE" /><p></p>',
    LIBXML_HTML_NOIMPLIED | 
    LIBXML_HTML_NODEFDTD);
...
$doc->saveHTML();

更新

如果您看到 UTF-8 字符被更改为一些奇怪的字符,那么使用 mb_convert_encoding 可以解决此问题,例如:

$doc->loadHTML(
    mb_convert_encoding('<p>hello</p><img src="REPLACE" /><p></p>', 'HTML-ENTITIES', 'UTF-8'), 
    LIBXML_HTML_NOIMPLIED | 
    LIBXML_HTML_NODEFDTD 
); 

【讨论】:

  • 感谢它的工作!它仍然通过用一些é字符替换它来破坏我的utf8。也有这样的选择吗? (抱歉,它不在 OP 中)
  • @rap-2-h 你可以试试:: $doc->loadHTML(mb_convert_encoding('

    hello

    ', 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD );

【解决方案2】:

如果你想使用 laravel 选项,那么你可以调用你拥有的部分并让它为你返回 html:

$src = "http://example.org/image.jpeg"
return view('path_to_partial', compact('src'))->render();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2011-07-21
    • 2016-12-21
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多