我有一个WordPress网站,我在其中手动实例化一个懒惰的加载js脚本。我想过滤the_content以查找任何图片,并将src
属性更改为data-original
,同时为图片添加lazy
类。
我发现这篇帖子:https://wordpress.stackexchange.com/a/60841/11169虽然有效,但是通过使用DOM解析器,我得到了一个html声明,并且渲染了额外的正文元素。
这导致了一些字符编码问题。
我能够通过在loadHTML
期间修改代码强制utf-8来解决这个问题,然后在返回内容之前我做了一些str_replace
来摆脱doctype,html,头部和身体元素。
function add_lazyload($content) {
$dom = new DOMDocument();
@$dom->loadHTML('<meta http-equiv="content-type" content="text/html; charset=utf-8">' . $content);
foreach ($dom->getElementsByTagName('img') as $node) {
// Get the original img source, place it in a data-original attr, and remove the source completely
$image_source = $node->getAttribute('src');
$node->setAttribute("data-original", $image_source);
$node->removeAttribute('src');
// Get the original classes, and add 'lazy'
$old_class = $node->getAttribute('class');
$new_class = $old_class . ' lazy';
$node->setAttribute("class", $new_class);
}
$newHtml = $dom->saveHtml();
$newHtml = str_replace('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">', null, $newHtml);
$newHtml = str_replace('<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body>', null, $newHtml);
$newHtml = str_replace('</body></html>', null, $newHtml);
// var_dump($newHtml);
return trim($newHtml);
}
这确实有效,但似乎完全没有效率。
也许我最好使用正则表达式来搜索和替换必要的内容,或者可能有某种方法将部分HTML加载到DOM中,而不必担心奇怪的字符编码问题。
任何建议都将不胜感激。
干杯!
答案 0 :(得分:1)
要加载HTML,您必须添加元素以使其成为完整的HTML文档(以避免编码问题)。但储蓄更容易。
PHP 5.3.6为$node
添加了DOMDocument::saveHTML()
参数。您只需要提供要保存的节点。
$xpath = new DOMXPath($dom);
$newHtml = '';
foreach ($xpath->evaluate('//body/node()') as $node) {
$newHtml .= $dom->saveHTML($node);
}
return $newHtml;
DOMXPath允许您使用DOM文档中的XPath获取节点。它是DOM扩展的一部分。 //body/node()
查找body
元素节点并获取所有子节点,包括文本节点。