IT Knowledge Base

~ Without sacrifice, there can be no victory ~

發佈日期:

分類:

,

如何使用PHP‧取得網上網頁中內容

現在的IT工作,其實與做雜工是沒有分別的,每天都是一堆與IT無關的事情。而這次,就是每天需要寄出給各位同事的外幣對換表。這些對換表,其實在每間銀行也會容易找到,但人就是這樣,明明是抄人的東西,卻硬要包裝成自己做的一樣。

01. 而今次要求的,就是發出去的電郵內容,與下面的差不多。

02. 而借來參考的銀行網站,就是香港的DBS的外幣對換表。

03. 看一看DBS的內容,其實所有的資料已經有齊,只是有些不用的貨幣需要刪除。其中一個做法,當然是每天左手抄右手,跟著表格來改價位。但對於一向懶慣的我,我情願花少少時間在程式碼上面。

04. 先把DBS網頁的內容的原程式碼倒出來,會看到的是一堆的HTML字,問題是要怎樣分析其內容。

05. 把內容全複製到NOTEPAD++內,尋找第一隻貨幣AUD。會看到其結構是使用了HTML TABLE中的TR及TD方式。

06. 初步知道了結構,就可以開始程式碼的工作,而今次繼續使用PHP,去解決問題。

07. 解釋一下程式碼內容,第一個工作,是使用file_get_contents函數,取得DBS的外幣表格內容。

$content = file_get_contents ("https://hk.dbs.com/ecPortalWeb/Rates/ExchangeRate.AXD?nls=en-us");

08. 之後會根據需要的貨幣資料,執行看訂的rates函數,取得有關資料,並儲存在陣列(Array)內。

$res[0] = rates(strpos($content, "AUD"), $content);

09. rates函數,就是根據DBS網頁的內容的原程式碼,取回相關資料。

function rates($val, $content) {
$p1 = strpos($content, "<td", $val+8);
$p2 = strpos($content, "</td>", $p1);
$p3 = strpos($content, "<td", $p2);
$p4 = strpos($content, "</td>", $p3);
$p5 = strpos($content, "<td", $p4);
$p6 = strpos($content, "</td>", $p5);
$p7 = strpos($content, "<td", $p6);
$p8 = strpos($content, "</td>", $p7);
$r[0] = substr($content, $val, 3);
$offset1 = strpos($content, ">", $p1)-$p1+1;
$offset2 = strpos($content, ">", $p3)-$p3+1;
$offset3 = strpos($content, ">", $p5)-$p5+1;
$offset4 = strpos($content, ">", $p7)-$p7+1;
$r[1] = substr($content, $p1+$offset1, $p2-$p1-$offset1);
$r[2] = substr($content, $p3+$offset2, $p4-$p3-$offset2);
$r[3] = substr($content, $p5+$offset3, $p6-$p5-$offset3);
$r[4] = substr($content, $p7+$offset4, $p8-$p7-$offset4);
return $r;
}

10. 最後就是把內容,用要求的方式展示出來。

$update = substr($content, strpos($content, "Last updated")+strlen("Last updated "), 10);
$eng_update = date_change($update);
echo '<table style="font-family: arial; font-size: 11pt; border: 1px solid black; border-collapse:collapse;">';
echo '<tr>';
echo '<td></td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">Current day</td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">Current day</td>';
echo '</tr>';
echo '<tr>';
echo '<td></td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">'.$eng_update.'</td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">'.$eng_update.'</td>';
echo '</tr>';
echo '<tr>';
echo '<td></td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">Against HKD</td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">Against HKD</td>';
echo '</tr>';
echo '<tr>';
echo '<td></td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">Sell to Bank</td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">Buy from Bank</td>';
echo '</tr>';
for ($i=0; $i<=9; $i++) {
echo '<tr>';
echo '<td style="padding: 5px; border: 1px solid black; width: 70px">'.$res[$i][0].'</td>';
for ($j=1; $j<=2; $j++) {
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">';
echo $res[$i][$j];
echo '</td>';
}
}
echo '</table>';
echo '<br>';
echo '<table style="font-family: arial; font-size: 11pt; border: 1px solid black; border-collapse:collapse;">';
echo '<tr>';
echo '<td></td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">Current day</td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">Current day</td>';
echo '</tr>';
echo '<tr>';
echo '<td></td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">'.$eng_update.'</td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">'.$eng_update.'</td>';
echo '</tr>';
echo '<tr>';
echo '<td></td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">Against USD</td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">Against USD</td>';
echo '</tr>';
echo '<tr>';
echo '<td></td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">Sell to Bank</td>';
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">Buy from Bank</td>';
echo '</tr>';
for ($i=0; $i<=9; $i++) {
echo '<tr>';
echo '<td style="padding: 5px; border: 1px solid black; width: 70px">'.$res[$i][0].'</td>';
for ($j=3; $j<=4; $j++) {
echo '<td style="padding: 5px; border: 1px solid black; width: 140px">';
echo $res[$i][$j];
echo '</td>';
}
}
echo '</table>';

11. 把檔案上載至Apache伺服器,用瀏覽器打開,便會看到以下的結果。

12. 需要時,只要把內容複製到電郵,便完成今次的工作。當然您會問,可不可以連發電郵的工作也自動化呢?這個當然是沒問題的,只要利用PHPMailer工具,其實可以輕易達到目的。但大前題是,有誰可保證,借回來的DBS外幣對換表內容不會更改呢?所以,某程度上每天的一點點檢查是有必要的。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *