PHP DOMDocument - 访问列表索引时遇到问题

时间:2013-06-03 11:58:23

标签: php domdocument

我正在为一个用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)来从列表中检索第一个标题,但遗憾的是无济于事。有点难过,快速的谷歌没有出现太多。

任何帮助将不胜感激!干杯,我也会继续看。

2 个答案:

答案 0 :(得分:2)

您可以使用 XPath

解决此问题
$dom = new DOMDocument();
@$dom->loadHTML($file);

$xpath = new DOMXPath($dom);

$title = $xpath->query('//title')->item(0)->nodeValue;

答案 1 :(得分:0)

尝试这样的事情:

$title->item(0)->nodeValue;

http://www.php.net/manual/en/class.domnodelist.php