MENU

从百度云存储直连看正则表达式的作用

June 1, 2013 • 程序

上个月开始一直在从事AllNippon.Net归来的新系统开发工作,因为计划主要涉及到大量的资料下载,为保证体验需要使用百度云存储直连下载功能。

刚开始我使用的是ThinkPHP官网看到的一份代码:

<?php
/*将本代码保存为bd.php 即可
利用 file_get_contents和preg_match_all、str_replace三个函数实现!
将百度网盘的$shareid 和 $uk 加入即可
例如:http://pan.baidu.com/share/link?shareid=489412&uk=101682133
自己服务器上就 localhost/bd.php?shareid=489412&uk=101682133 就可以自己下载了
*/
$shareid =$_GET['shareid'];
$uk = $_GET['uk'];
if(isset($shareid) && isset($uk)) {
    $str = file_get_contents("http://pan.baidu.com/share/link?shareid={$shareid}&uk={$uk}");
    preg_match_all('|"dlink\\\":\\\"([^"]+)\\\",\\\"|imsU', $str, $baiduid);
    $down = str_replace("\\","",$baiduid[1][1]);
}
header('Location: '.$down);

这份代码通过获取下载页面,用正则表达式匹配出js中的下载地址将其发送回客户端。实现过程很不错,本地、远程环境均测试了一个资源,十分好使,于是就将其改编后部署在了系统中。系统的一些模块有了雏形之后,我尝试发布了一份资源,但是点下载却没有任何反应。这不禁让我觉得奇怪,左分析来右分析去也没有得到什么有价值的结论。遂搜索之,得到了数分实现相同功能的代码。

这些代码基本上都是使用的在html中用正则表达式匹配相应元素而获取链接,但都已经失效,没有任何利用价值。想到了原来使用的那一版的原理,我决定自己写一个来匹配,更好掌控。对正则表达式不熟是一个大问题,不过还好,有txt2re帮忙想要用正则表达式实现什么功能就不是大问题了。

<?php
$shareid = $_GET['shareid'];
$uk = $_GET['uk'];
$str = file_get_contents("http://pan.baidu.com/share/link?shareid={$shareid}&uk={$uk}");
$down = str_replace("\\", '', $str);//将源文件中的反斜杠过滤
$re1 = '(dlink)';//匹配js中的dlink
$re2 = '.*?';
$re3 = '((?:http|https)(?::\\/{2}[\\w]+)(?:[\\/|\\.]?)(?:[^\\s"]*))';//过滤掉反斜杠后直接剩余了url
$re4 = '(")';
$re5 = '(\\})';
$c = preg_match_all ("/".$re1.$re2.$re3.$re4.$re5."/is", $down, $matches);
header('Location: '.$matches[2][0]);//header将真实url转发给客户端

测试了一下,确实可以,遂整合之,部署至AllNippon.Net系统当中。至此,问题顺利解决。如果百度云之后继续改,那么自己也就继续改吧~

由此观之,正则表达式确实是十分有用的工具,许多场合中均可以用到。因此,今后一定要多多学习,早日掌握它的使用。

Tags: php
Archives Tip
QR Code for this page
Tipping QR Code