DOM解析部分HTML的问题

时间:2014-12-12 10:53:43

标签: php html parsing dom

我有一个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中,而不必担心奇怪的字符编码问题。

任何建议都将不胜感激。

干杯!

1 个答案:

答案 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元素节点并获取所有子节点,包括文本节点。