PHP GetElementsByTagName错误

时间:2014-04-16 13:54:06

标签: php

我写了一个很长的代码,我不得不从网站上检索很多标签,例如标题,h1,h2,h3,a,p等等。我首先用preg_match做了这个,但很快意识到这个这是错误的做法。所以我开始使用它:

function getTextBetweenTags($string, $tagname){
    $d = new DOMDocument();
    $d->loadHTML($string);
    $return = array();
    foreach($d->getElementsByTagName($tagname) as $item){
        $return[] = $item->textContent;
    }
    return $return;
}

并检索标记:$title = getTextBetweenTags($contents, 'title');

这在testpage上正常使用,这是一个维基百科页面。

但是当我在另一个页面上测试它时,它给了我很多这样的错误:

Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: Input is not proper UTF-8, indicate encoding ! in Entity

在这之后很多:

Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: expecting ';' in Entity,

我做了一些研究,发现它期望'&'而不是&,所以在每个'特殊字符'之后它会期望;,但因为它使用{{1}检索内容(file_get_contents)。我真的不想回到$file_contents = file_get_contents($url);(显而易见的原因)所以我想问你们是否知道如何解决我的问题。

提前致谢!

1 个答案:

答案 0 :(得分:1)

您可以使用libxml_use_internal_errors()解决此问题。目前,每次调用函数时,函数都会调用loadHTML()。我只是在函数外部加载HTML并将其作为参数传递。

$dom = new DOMDocument();
$errorState = libxml_use_internal_errors(TRUE); // don't display errors
$dom->loadHTML($string);
libxml_use_internal_errors($errorState); // reset the state

function getTextBetweenTags(DOMDocument $dom, $string, $tagname) {
    $return = array();
    foreach($dom->getElementsByTagName($tagname) as $item){
        $return[] = $item->textContent;
    }
    return $return;
}

使用示例:

$string = file_get_contents($url);
$title = getTextBetweenTags($dom, $string, 'title');