首先贴出原文链接:https://jingyan.baidu.com/article/922554465bf115851748f45f.html

方法如下:

function getRate($from, $to, $amount){
  $data = file_get_contents("http://www.baidu.com/s?wd={$from}%20{$to}&rsv_spt={$amount}");preg_match("/<div>1\D*=(\d*\.\d*)\D*<\/div>/",$data, $converted);
  $converted = preg_replace("/[^0-9.]/", "", $converted[1]);
  return number_format(round($converted, 3), 3);
}

刚开始我还真以为是百度给的汇率接口,结果我把$data直接打印出来才发现这是抓取的页面内容,不过确实能用,感觉这种方式很多东西都可以获取到了,但是不知道会有什么风险。

如果想获得更为准确和及时的汇率信息,当然只能去中国银行的官网去获得了。http://www.boc.cn/sourcedb/whpj/

(不知道是否有实时的免费的汇率接口,反正我这里没有找到,如果有哪位读者找到了,麻烦分享一下)

此处以获得欧元汇率为例:

1.我们先去分析一下页面的接口(右键->查看源代码)得到该页面的代码。

因为我们打开网页的时候并不是我们想要的内容,通常搜索结果都会是异步获取的,我们需要找到它异步获取数据的方式

由此我们可以看出,由此我们可以得到他的搜索结果的获取地址:http://srh.bankofchina.com/search/whpj/search.jsp?erectDate=2017-11-13&nothing=2017-11-13&pjname=1326&page=1

那么我们就可以传递对应参数拉取到对应页面

$pageCode = file_get_contents("http://srh.bankofchina.com/search/whpj/search.jsp?erectDate=2017-11-13&nothing=2017-11-13&pjname=1326&page=1");

2.截取我们需要的内容这里就稍微得用到正则表达式了。

分析一下我们需要的数据是个什么结构

这是原始的 源代码,,我将其 空格 换行 制表符等全部删掉,然后开始匹配 (由于我技术有限所已并不能一次性很完美的解析出内容一下是我粗暴的做法)

$data = str_replace(array(" ","\r","\n","\t"), "",$pageCode);
  preg_match('/<tr>[\s]*<td>欧元<\/td>[\s]*<td>[\s|\S]*<\/td>[\s]*<\/tr>/',$data, $converted);//这里其实可以一次性匹配解析出想要的数据,只是需要好好熟悉一下正则,
  $data = str_replace("</tr><tr>", ";", $converted[0]);
  $data = str_replace(array("<tr>","</tr>"), "", $data);
  $data = str_replace("</td><td>", ",", $data);
  $data = str_replace(array("<td>","</td>"), "", $data);
  $rateList = explode(";", $data);
  $rate = explode(",", $rateList[0]);

整理为方法如下:

function getEurRate(){
  $date = date("Y-m-d", time());
//获得页面代码
$data = file_get_contents("http://srh.bankofchina.com/search/whpj/search.jsp?erectDate=".$date."&nothing=".$date."&pjname=1326&page=1");
//去掉非字符
$data = str_replace(array(" ","\r","\n","\t"), "", $data);
//得到汇率代码
preg_match('/<tr>[\s]*<td>欧元<\/td>[\s]*<td>[\s|\S]*<\/td>[\s]*<\/tr>/',$data, $converted);
//开始各种调整格式 为了整理为 数组
$data = str_replace("</tr><tr>", ";", $converted[0]); $data = str_replace(array("<tr>","</tr>"), "", $data); $data = str_replace("</td><td>", ",", $data); $data = str_replace(array("<td>","</td>"), "", $data); $rateList = explode(";", $data); $rate = explode(",", $rateList[0]); //$rate [0] 国家 [1] 现汇买入价 [2]现钞买入价[3]现汇卖出价[4]现钞卖出价[5]外管局中间价[6]中行折算价 $rate = $rate[3]; $rate = round(($rate/100),2); if(is_numeric($rate))return $rate; else return false; }

简单粗暴,但是有效。有很多可优化的地方我就不多描述了。