【问题标题】:PHP Dom: nodeValue read as object instead of stringPHP Dom:nodeValue 读取为对象而不是字符串
【发布时间】:2011-11-01 20:31:46
【问题描述】:

我正在尝试从一堆网页中提取链接并在表格中报告它们。我有这个函数,get_links($pageId),应该是获取页面内容,拉出每个锚标签的values和href属性。

function get_links($pageId) {
    $page_contents = file_get_contents('http://www.mysite.com/?p='.$pageId);
    $html = new DOMDocument();
    @$html->loadHTML($page_contents);
    $anchors = $html->getElementsByTagName('a');
    $link_array = array();
    foreach($anchors as $anchor) {
        if (!empty($anchor->nodeValue)) {
            $text = $anchor->nodeValue;
            $link = $anchor->getAttribute('href');
            $link_array[$text] = $link;
        }
    }
    return $link_array;
}

当我在其中一个页面上运行此函数时,它什么也不返回。例如,如果我调用:

$page_links = get_links('someId');
foreach($page_links as $text->$link) {
    //my print functions
};

我收到 foreach 行的“致命错误:无法访问空属性”。

在 foreach($anchors) 循环中回显 $text 和 $link 可以正常工作。在循环之后回显来自 $link_array 的值也是如此。但是回显 keys 不会。如果我在循环之后立即进行此测试:

foreach($link_array as $text->$link) {echo $text;}

我收到此错误:“可捕获的致命错误:stdClass 类的对象无法转换为字符串。”

为什么它在循环过程中打印正常,但当我将它放入数组中返回时被视为对象?

【问题讨论】:

    标签: php dom


    【解决方案1】:

    您正在尝试将 foreach 循环的迭代值分配给对象的属性。我想你真的想要

    foreach($link_array as $text => $link) { echo $text;}
    

    改为。

    $text->$link 是告诉 PHP 获取当前的 foreach 迭代值,并将其分配给 $text 对象的 $link 属性 - 但是,此时 $text 和 $link 不是对象,所以你是分配给不存在对象的不存在属性,导致“无法访问空属性”错误。

    【讨论】:

    • +1 $text => $link 不是 $text->$link。阅读错误信息。
    • 呃。谢谢你。自从我用 PHP 编码以来已经有一段时间了……语法错误总是让我着迷!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2014-02-08
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多