试图用curl解析远程站点

时间:2014-04-30 12:38:51

标签: php curl

我有以下代码。尝试解析远程站点的登录页面以检索隐藏的令牌。一旦我检索到令牌,我就可以从我的php页面登录到远程站点。但是,我在解析远程登录页面上的隐藏令牌时遇到了问题。这是我的代码

$url = 'http://uk.songselect.com/account/login/';

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);





//run the process and fetch the document
$doc = curl_exec($ch);
curl_close($ch); 

//echo $doc;


// extract __RequestVerificationToken input field
$token = explode('<input name="__RequestVerificationToken" type="hidden" value="',$doc);
$token = explode('" />',$token[1]);
$token = $token[0];

echo $token;

如果返回以下错误:

Notice: Undefined offset: 1 in songselect.php on line 24

任何帮助都会非常感激。

谢谢!

3 个答案:

答案 0 :(得分:0)

正如@Halycon所说,你的爆炸失败了。

IMO Dom解析会更容易:

将页面html保存到$ html var,替换

$doc = curl_exec($ch);

使用:

$html = curl_exec($ch);

然后使用dom解析和xpath:

获取输入值
$doc = new DOMDocument();
$doc->loadHTML($html);
$xp = new DOMXpath($doc);
$nodes = $xp->query('//input[@name="__RequestVerificationToken"]');
$node = $nodes->item(0);
$v = $node->getAttribute('value');

$ v现在持有__RequestVerificationToken值

答案 1 :(得分:0)

使用preg_match(),您可以按如下方式检索令牌:

preg_match('/<input name="__RequestVerificationToken" type="hidden" value="([^"]*)" \/>/',$doc,$matches);
$token=$matches[1];

可以改善模式。这只是一个简单的例子。

答案 2 :(得分:0)

$url = 'http://uk.songselect.com/account/login/';

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);


//run the process and fetch the document
$doc = curl_exec($ch);
curl_close($ch); 


// extract __RequestVerificationToken input field
preg_match('#<input name="__RequestVerificationToken" type="hidden" value="(.*?)"#is', $doc, $match);

echo $token = $match[1];