【免費註冊】 【會員登入】 【個人資料】 【會員列表】 【論壇幫助】 【論壇搜尋】 【登出論壇】

∮Ω奧米加空間∮
∮Ω奧米加空間∮»PHP 交流區»【教學】利用 PHP 取得網頁 IP 內容並分析

訂覽該主題更新消息 | 將該主題推薦給朋友 發表新主題 發起投票  回覆
作者 主題    
dc
管理員



性別:男
來自:瓦肯星
發表總數:11790
註冊時間:2002-05-07 16:32
(第 1 篇) 【教學】利用 PHP 取得網頁 IP 內容並分析

感謝答客問的網友 mudong 提供的代碼 :)

我煩惱了兩天都想不出來 mudong 一下子就解決了~真是深藏不漏的高手 :)

程式會輸出三個檔,
一個是網頁ip列表,
一個是處理過的IP列表,
一個是目前無法處理的IP列表。
另外優先處理IP範圍是 0.0.0 - 255.255.255, 0.0-255.255, 0-255 三種。


整理一下,目前可以處理的IP 型式是以下幾種:
1.2.3.0 - 1.2.3.255 //123同,0-255結尾。
1.2.a.0 - 1.2.b.255 //12同,0-255結尾。
1.a.0.0 - 1.b.255.255 //1同,0.0-255.255結尾。

無法處理的也把它輸出為一個檔,方便再處理。
只是很剛好那個網站的IP範圍已經都分成以上三類,所以未處理列表剛好是空的。

自我測試時可以用本地檔案來測試,改一改網頁內容IP測試。
無法處理的類型如下: (有兩項不同的)
22.2.2.0 - 22.4.255.255
22.22.22.0 - 22.24.25.255

如果真碰到了,可能得手動幫它拆行了。

代碼:

<?php
//韓國 IP 列表網頁
//$url="http://ipstat.nida.or.kr/korea_ip/korea_ip4_data.jsp";
$url="./korea_ip4_data.htm";
//要儲存的本地端檔案
$filename = './test.txt';     //處理後的IP列表
$filenameX = './testX.txt';   //未處理的IP列表
$filenameO = './testO.txt';   //網頁原始IP名單列表
//遠端開啟網頁
$content=file_get_contents($url);
//分析網頁格式
//從<tr>到<td>*.*.*.*</td> 取的IP範圍位置存入陣列 $title
preg_match_all("|<tr[^>]*>[\s\w\n\r]*<td[^>]*>[\s]*(\d+.\d+.\d+.\d+)[\s]*<\/td>[\w\s\n\r]+<td[^>]*>[\s]*(\d+.\d+.\d+.\d+)[\s]*<\/td>|U",$content,$title);
//循環取得 IP 位置,檢查列表
for   ($i=0; $i<count($title[0]); $i++)  
{
echo $title[1][$i]."".$title[2][$i]."\n";
}
//
$ipSt = $title[1];
$ipEd = $title[2];
//print_r ($ipSt);
//print_r ($ipEd);
//----
$iptotal = "";
$iptotalz = "";
$iptotalx = "";

for ($i=0; $i<count($ipSt); $i++)
{
$ips = split("\.", $ipSt[$i]);  
$ipe = split("\.", $ipEd[$i]);  
////優先處理 ?.0.0.0-255.255.255, 前一同.?.0.0-255.255, 前二同.?.0-255 三種
////0.0.0-255.255.255
if (($ips[1]==0)&&($ips[2]==0)&&($ips[3]==0)&&($ipe[1]==255)&&($ipe[2]==255)&&($ipe[3]==255))
{ $ips[1]="*"; $ips[2]="*"; $ips[3]="*";
   $ipe[1]="*"; $ipe[2]="*"; $ipe[3]="*";
for ($j=$ips[0]; $j<=$ipe[0]; $j++)
{ $ips[0]=$j;
  $iptotal  .= "$ips[0].$ips[1].$ips[2].$ips[3]\r\n";
}
}
////前一同.?.0.0-255.255   //只有第二位不同
else if (($ips[0]==$ipe[0])&&($ips[2]==0)&&($ips[3]==0)&&($ipe[2]==255)&&($ipe[3]==255))
{ $ips[2]="*"; $ips[3]="*";
   $ipe[2]="*"; $ipe[3]="*";
for ($j=$ips[1]; $j<=$ipe[1]; $j++)
{ $ips[1]=$j;
  $iptotal  .= "$ips[0].$ips[1].$ips[2].$ips[3]\r\n";
}
}
////前二同.?.0-255   //只有第三位不同
else if (($ips[0]==$ipe[0])&&($ips[1]==$ipe[1])&&($ips[3]==0)&&($ipe[3]==255))
{ $ips[3]="*";
   $ipe[3]="*";
for ($j=$ips[2]; $j<=$ipe[2]; $j++)
{ $ips[2]=$j;
  $iptotal  .= "$ips[0].$ips[1].$ips[2].$ips[3]\r\n";
}
}
////其它未處理的。
else {$iptotalx .= "$ipSt[$i]$ipEd[$i]\r\n";}
////for的結尾
}
echo "=====未處理列表 Start====\r\n";
print_r ($iptotalx);
echo "=====未處理列表 End =====\r\n";
//----------顯示在營幕上
//echo "====Start====\r\n";
//print_r ($iptotal);
//echo "=====End=====\r\n";
//
//存成檔案
//
$ipO = "";
foreach ($ipSt as $k => $v) { $ipO .= "$v$ipEd[$k]\r\n";}
$somecontentO = "$ipO";       //網頁原始IP名單列表
$somecontent = "$iptotal";    //處理後的IP列表
$somecontentX = "$iptotalx";  //未處理的IP列表
$handle = fopen ($filename, "w");
fwrite($handle, $somecontent);
fclose($handle);
$handle = fopen ($filenameX, "w");
fwrite($handle, $somecontentX);
fclose($handle);
$handle = fopen ($filenameO, "w");
fwrite($handle, $somecontentO);
fclose($handle);
?>







Your mind to my mind,

your thought to my thought
發表時間:2008-09-24 21:00
dc的個人資料 傳送郵件給dc dc的個人首頁 dc發表的所有文章 送出悄悄話給dc IP:118.*.*.* 編輯  引言回覆 
dc
管理員



性別:男
來自:瓦肯星
發表總數:11790
註冊時間:2002-05-07 16:32
(第 2 篇) korea_ip4_data.htm

korea_ip4_data.htm
http://omega.idv.tw/doc/ip2star/korea_ip4_data.htm

網頁原始IP名單列表
http://omega.idv.tw/doc/ip2star/testO.txt

處理後的IP列表
http://omega.idv.tw/doc/ip2star/test.txt

未處理的IP列表
http://omega.idv.tw/doc/ip2star/testX.txt




本帖由dc最後編輯於2008-09-24 21:18

Your mind to my mind,

your thought to my thought
發表時間:2008-09-24 21:11
dc的個人資料 傳送郵件給dc dc的個人首頁 dc發表的所有文章 送出悄悄話給dc IP:118.*.*.* 編輯  引言回覆 
dc
管理員



性別:男
來自:瓦肯星
發表總數:11790
註冊時間:2002-05-07 16:32
(第 3 篇)

舉例的韓國 IP4 配發網址已經變更為
https://ip.nida.kr/ip_cate_ipv4/ipv4_04_01.act

還有紀錄 IP 範圍的格式本來為
代碼:

                  <tr align="center" bgcolor="ffffff">
                    <td>202.6.95.0</td>
                    <td>202.6.95.255</td>
                    <td>           1</td>

                    <td>1991.06.11.</td>
                  </tr>

現在變更為
代碼:

                  <tr>
                    <td align="center">202.6.95.0</td>
                    <td background="../ip_img/pro_t_vline.gif"> </td>
                    <td align="center">202.6.95.255</td>
                    <td background="../ip_img/pro_t_vline.gif"> </td>
                    <td align="center">1</td>
                    <td background="../ip_img/pro_t_vline.gif"> </td>

                    <td align="center">19910611</td>
                  </tr>

多了一欄造成範例內的正規表達式無效,無法取得 IP 位置。
需變更成下列的正規表達式才有效
代碼:

preg_match_all("|<tr[^>]*>[\s\w\n\r]*<td[^>]*>[\s]*(\d+.\d+.\d+.\d+)[\s]*<\/td>[\b\d\s\w./<>;&=\"]+<td[^>]*>[\s]*(\d+.\d+.\d+.\d+)[\s]*<\/td>|U",$content,$title);


用 IE 另存新檔把網頁存成 html 到本機分析會沒有資料~需使用 Firefox 另存新檔把網頁存成 html 到本機分析才行。






Your mind to my mind,

your thought to my thought
發表時間:2009-04-03 17:28
dc的個人資料 傳送郵件給dc dc的個人首頁 dc發表的所有文章 送出悄悄話給dc IP:210.*.*.* 編輯  引言回覆 
所有時間均為GMT+8, 現在是2026-10-24 18:51    
訂覽該主題更新消息 | 將該主題推薦給朋友 發表新主題 發起投票  回覆

快速回覆
主題 ( 回覆文章可以不輸入標題 )
URLs自動分析
有回覆時郵件通知
禁用表情符號
使用簽名

<聯絡我們 - OMEGA - 控制面板>

Powered by Centaur & Joksky & DC, ver 2003.08.14
Copyright ©2002-2008 PHPY.COM


頁面生成時間:0.0062670707702637