如何使用PHP获取远程HTML代码中的<input />值?

时间:2011-08-01 19:30:41

标签: php xml xhtml

在远程站点中,有一个HTML文件(例如http://www.example.com/abc.html),其内容为:

<input id="ID1" name="NAME1" value="VALUE1">

在我服务器的PHP代码中,我需要来自http://www.example.com/abc.html的“VALUE1”。我怎么能用PHP做到这一点?

由于远程html是用XHTML 1.0编写的,我想我可以使用XML解析器吗?


ADDED

使用xml_parse_into_struct,我获得了一个包含以下内容的数组:

[15] => Array
    (
        [tag] => INPUT
        [type] => complete
        [level] => 4
        [attributes] => Array
            (
                [TYPE] => hidden
                [NAME] => NAME1
                [ID] => ID1
                [VALUE] => VALUE1
            )

    )

如何获得“VALUE1”?我想现在这更像是在PHP中处理数组的问题。我总是知道名字“NAME1”,但我不知道值“VALUE1”。所以我想使用“NAME1”获取“VALUE1”,这是我所知道的信息。

4 个答案:

答案 0 :(得分:1)

为什么不使用简单的正则表达式?

$html = '<input id="ID1" name="NAME1" value="VALUE1">';

if (preg_match('/name="NAME1".+value="(.*?)"/i', $html, $matches)) {
   echo $matches[1];  // should echo VALUE1;
}

唯一的限制是name必须出现在HTML元素中的value之前。

答案 1 :(得分:1)

这一切都取决于你将如何获取整个数组。但是,通过上面的示例,您可以获得$array[15]['attributes']['VALUE']的值,其中变量$array是用于将xml_parse_into_struct输出呈现的变量。但是如果你想要它是动态的,我建议一些更聪明的东西,因为我认为如果向页面添加更多元素,关键索引15将会改变。

$array = xml_parse_into_struct($string);
foreach ($array as $key => $value) {
  if($value['attributes']['NAME'] == 'NAME1') {
    $input_value = $value['attributes']['VALUE'];
    break; // unless you need to do more here just break out.
  }
}

print $input_value;

答案 2 :(得分:0)

如果你知道元素的名称并且真正只是在一件小事之后并且页面的格式始终相同,那么仅使用curlexplode可能就不那么重要了用字符串比较解析文档。这是一种快速而肮脏的方法,但只要满足这两个条件,这可以说是最快的方式:

$url = 'http://example.com/';
$options = array(
CURLOPT_RETURNTRANSFER => true,     // return web page
CURLOPT_HEADER         => false,    // don't return headers
CURLOPT_FOLLOWLOCATION => true,     // follow redirects
CURLOPT_ENCODING       => "",       // handle all encodings
CURLOPT_USERAGENT      => "spider", // who am i
CURLOPT_AUTOREFERER    => true,     // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
CURLOPT_TIMEOUT        => 120,      // timeout on response
CURLOPT_MAXREDIRS      => 10       // stop after 10 redirects
);

$ch      = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err     = curl_errno( $ch );
$errmsg  = curl_error( $ch );
$header  = curl_getinfo( $ch );
curl_close( $ch );
$parts = explode('<input id="ID1" name="NAME1" value="', $content);
if (count($parts) == 2) {
    $value = explode('">', $parts[1]);
    $value = $value[0];
} else {
    $value = false;
}

print 'Value is: ' . $value;

否则,您可以使用正则表达式(再次使用上面的curl):

preg_match('/name="NAME1".+value="(.*?)"/i', $html, $value);
$value = $value[1];

最后,如果你想全力以赴,你可以使用文档解析器。但是,请注意,如果您正在使用的HTML格式不正确,则解析器将遇到问题。以下是使用第三方课程的主题教程:http://net.tutsplus.com/tutorials/php/html-parsing-and-screen-scraping-with-the-simple-html-dom-library/

答案 3 :(得分:-3)

如果您需要将变量从html页面传递到PHP代码,请使用html中的表单(http://www.w3.org/TR/html4/interact/forms.html)和$_POSThttp://www.php.net/manual/en/reserved.variables.post.php)或$_GET({{3 PHP中的变量。如果你不熟悉PHP中的数组,请看一下:http://www.php.net/manual/en/reserved.variables.get.php