我有以下代码。尝试解析远程站点的登录页面以检索隐藏的令牌。一旦我检索到令牌,我就可以从我的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
任何帮助都会非常感激。
谢谢!
答案 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];