Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP GetElementsByTagName错误_Php - Fatal编程技术网

PHP GetElementsByTagName错误

PHP GetElementsByTagName错误,php,Php,我写了一个很长的代码,我不得不从一个网站上检索很多标签,例如标题,h1,h2,h3,a,p等等。我首先用preg_match做了这件事,但很快意识到这是错误的做法。所以我开始用这个: function getTextBetweenTags($string, $tagname){ $d = new DOMDocument(); $d->loadHTML($string); $return = array(); foreach($d->getElement

我写了一个很长的代码,我不得不从一个网站上检索很多标签,例如标题,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上运行良好,这是一个wikipedia页面

但当我在另一页上测试它时,它给了我很多错误,比如:

警告:DOMDocument::loadHTML()[DOMDocument.loadHTML]:输入不正确UTF-8,请指示编码!在实体中

在这之后有很多:

警告:DOMDocument::loadHTML()[DOMDocument.loadHTML]:HTMLParserEntityRef:应为“;”在实体中,

我做了一些研究,发现它期待一个
“&;”而不是
&
,例如,在每个“特殊字符”之后,它都需要一个
但由于它使用
file\u get\u contents
检索内容(
$file\u contents=file\u get\u contents($url);
)。我真的不想回到
preg\u match
(出于明显的原因),所以我想问你们是否知道如何解决我的问题


提前谢谢

您可以使用解决此问题。当前,每次调用函数时,函数都会调用
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');

欢迎来到解析无效html的世界…嘿,谢谢你的回答,它比以前工作得多!但是,它不再允许我找到
标题
i
。而且不知怎么搞砸了我的if语句。我不知道你有没有时间看看这个?如果你感兴趣,我会编辑我的问题,你可以看一下。好吧,我解决了我的问题,我在
$dom->loadHTML($string)中包含了错误的
$
。谢谢你的帮助。我接受了你的回答。