首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP GetElementsByTagName错误

PHP GetElementsByTagName错误
EN

Stack Overflow用户
提问于 2014-04-16 13:54:05
回答 1查看 81关注 0票数 0

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

代码语言:javascript
复制
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');

这在正在使用的测试页面上运行得很好,这是维基百科的一个页面。

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

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

在这一次之后:

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

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

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-16 14:00:49

您可以使用libxml_use_internal_errors()解决这个问题。目前,您的函数每次调用该函数时都会调用loadHTML()。我只需将HTML加载到函数之外,并将其作为参数传递。

代码语言:javascript
复制
$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;
}

示例用法:

代码语言:javascript
复制
$string = file_get_contents($url);
$title = getTextBetweenTags($dom, $string, 'title');
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23111504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档