0
<html>

<head>
<?PHP
include('simple_html_dom.php');
?>
<title>

</title>
</head>

<body>
<form name ="form1" method ="POST" ACTION="parser.php">
<input type="text" name="parser1" style="height:200px; width:200pt;"></br></br>
<input type="submit" value="Submit"></br></br>
</form>

<?php

$html_str = $_POST['parser1'];

// Create DOM from URL or file
$html = file_get_html($html_str);
$html->load('
<form name="form1" action="parser.php" method="post">
<input type="text" name="parser1">
</form>');

// Get the form action
foreach($html->find('form') as $element) 
   echo $element->action . '<br>';

// Get the input name       
foreach($html->find('input') as $element) 
   echo $element->name . '<br>';
?>
</body>

</html>

在这里,我正在尝试将 html 源代码输入到文本框中parser1

然后我使用 post 将文本框中的数据捕获到字符串中html_str

当我尝试解析该字符串时,我开始收到错误。

致命错误:在第 24 行的 /home/public_html/parser.php 中的非对象上调用成员函数 load()

请帮忙

4

2 回答 2

1

你有这个:

$html = file_get_html($html_str);
$html->load('
<form name="form1" action="parser.php" method="post">
<input type="text" name="parser1">
</form>');

错误消息说这$html不是一个对象。file_get_html()不是内置函数,但您似乎正在使用PHP Simple HTML DOM Parser。它的API 文档说它返回一个对象,但没有提供额外的信息。如果我们查看源代码:

function file_get_html($url, $use_include_path = false, $context=null, $offset = -1, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
{
    // We DO force the tags to be terminated.
    $dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText);
    // For sourceforge users: uncomment the next line and comment the retreive_url_contents line 2 lines down if it is not already done.
    $contents = file_get_contents($url, $use_include_path, $context, $offset);
    // Paperg - use our own mechanism for getting the contents as we want to control the timeout.
    //$contents = retrieve_url_contents($url);
    if (empty($contents) || strlen($contents) > MAX_FILE_SIZE)
    {
        return false;
    }
    // The second parameter can force the selectors to all be lowercase.
    $dom->load($contents, $lowercase, $stripRN);
    return $dom;
}

...我们可以看到它FALSE有时会返回:

if (empty($contents) || strlen($contents) > MAX_FILE_SIZE)
{
    return false;
}

所以我敢说你的 POST 字段要么是空的,要么是太大的。你真的应该在打电话之前检查一下->load()

更新:

file_get_html()功能:

从文件或 URL创建 DOM 对象。

我想你真正想要的是str_get_html()

从一个字符串创建一个 DOM 对象。

于 2013-02-21T12:42:28.537 回答
0

如果您实际检查表单是否已提交,这可能会有所帮助。您必须检查并重新检查输入是否有效。

// check if it's a POST request
if($_SERVER['REQUEST_METHOD'] === 'POST') {
    // check if parser1 is not empty
    if(!empty($_POST['parser1'])) {
        $input = $_POST['parser1'];

        if(filter_var($input, FILTER_VALIDATE_URL)) { // looks like an URL
            $html = file_get_html($input); // download URL
        } else { // lets assume it's HTML, because it's not an URL
            $html = str_get_html($input);
        }

        // If something goes wrong here, the input is invalid
        if(!empty($html)) {
             // parse DOM document here
        } else {
            // There is something wrong with the input
        }
    }
}
于 2013-02-21T12:01:52.487 回答