我试图通过cURL从登录页面获取网站收入。我知道这是一种草率的方式,但我别无选择。
<?php
$username = "example";
$password = "example";
$postfields = "email=$username&password=$password";
// Use Curl to return the raw source of a webpage to a variable called
$ch = curl_init();
//curl_setopt($ch, CURLOPT_HEADER, 1); // Get the header
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // Allow redirection
curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookie");
curl_setopt($ch, CURLOPT_URL, "https://www.domain.com/login");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "$postfields");
$page = curl_exec($ch);
curl_close($ch); // Closing
if (preg_match("/<th>(.*)<\/th/s", $page, $matches)) {
echo $matches[1];
}
?>
基本上我能够通过登录很好,它会将我重定向到我试图从中获取收入的特定网站的仪表板,但是当尝试使用preg_match它没有抓住任何东西时,它只是打印所有仪表板的HTML。
我只想获得&#34; 99.99美元&#34;在
之内<th>$99.99</th>
非常感谢。
答案 0 :(得分:1)
你的正则表达式是贪婪的,如果有多个<th>
,它可能会抓取几个[^<]+
的内容。尝试使用正则表达式解析HTML或XML通常不是一个好主意。 HTML解析器将更有效地完成此任务。我偏爱DOMDocument。
要解决手头的问题,<
会收集所有字符,但不包括下一个if (preg_match("/<th>([^<]+)<\/th/s", $page, $matches)) {
echo $matches[1];
}
。
preg_match_all()
如果要检索多个<th>
,请使用{{1}},因为上面只会获得第一个。{/ p>
答案 1 :(得分:1)
将此行添加到您的代码中:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
..否则curl只打印出会话结果。我建议你的正则表达式也不贪婪:它现在只有一个<th>
,但这部分代码可能被复制粘贴(作为一个完美的工作)到其他程序中 - 并且会导致麻烦。 )