我正在为一个用 php 编写并在 linux cli 上运行的 IRC 机器人编写一些代码。我的代码在检索网站标题标签并使用 DOMDocument NodeList 显示它时遇到了一点问题。基本上,在具有两个或更多标签的网站上(你会惊讶于实际上有多少......)我只想处理第一个标题标签。正如您从下面的代码中看到的(处理一个或多个标签时效果很好),有一个 foreach 块,它在其中迭代每个标题标签。
public function onReceivedData($data) {
// loop through each message token
foreach ($data["message"] as $token) {
// if the token starts with www, add http file handle
if (strcmp(substr($token, 0, 4), "www.") == 0) {
$token = "http://" . $token;
}
// validate token as a URL
if (filter_var($token, FILTER_VALIDATE_URL)) {
// create timeout stream context
$theContext['http']['timeout'] = 3;
$context = stream_context_create($theContext);
// get contents of url
if ($file = file_get_contents($token, false, $context)) {
// instantiate a new DOMDocument object
$dom = new DOMDocument;
// load the html into the DOMDocument obj
@$dom->loadHTML($file);
// retrieve the title from the DOM node
// if assignment is valid then...
if ($title = $dom->getElementsByTagName("title")) {
// send a message to the channel
foreach ($title as $theTitle) {
$this->privmsg($data["target"], $theTitle->nodeValue);
}
}
} else {
// notify of failure
$this->privmsg($data["target"], "Site could not be reached");
}
}
}
}
我更喜欢以某种方式将其限制为仅处理第一个标题标签。我知道我可以用一个变量将 if 语句包装在它周围,这样它只会回显一次,但我更倾向于使用“for”语句来处理一次迭代。但是,当我这样做时,我无法使用 $title->nodeValue; 访问 title 属性。它说它是未定义的,只有当我使用 foreach $title 作为 $theTitle 时,我才能访问这些值。我试过 $title[0]->nodeValue 和 $title->nodeValue(0) 从列表中检索第一个标题,但不幸的是无济于事。有点难过,快速谷歌并没有出现很多。
任何帮助将不胜感激!干杯,我也会继续寻找。