我写了一个很长的代码,我不得不从网站上检索很多标签,例如标题,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);
(显而易见的原因)所以我想问你们是否知道如何解决我的问题。
提前致谢!
答案 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');