我写了一段很长的代码,我不得不从一个网站上检索很多标签,比如标题,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');
这在正在使用的测试页面上运行得很好,这是维基百科的一个页面。
但是,当我在另一页上测试它时,它给了我很多这样的错误:
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 (出于显而易见的原因),所以我想问你们是否知道如何解决我的问题。
提前感谢!
发布于 2014-04-16 14:00:49
您可以使用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');https://stackoverflow.com/questions/23111504
复制相似问题