header

IPアドレスとホスト名を相互変換する

(1/1)

前回の応用として、 与えられた文字列が IP アドレスだったらホスト名へ変換、 逆に、ホスト名だったら IP アドレスへ変換するプログラムを作ってみることにする。

サンプル・プログラム

0001: <?php
0002: /** ip2host.php
0003:  * IPアドレスをホスト名に、ホスト名をIPアドレスに変換する
0004:  *
0005:  * @copyright (c)studio pahoo
0006:  * @author     パパぱふぅ
0007:  * @version     1.0  2007/03/04
0008: */
0009: $myself = basename($_SERVER["SCRIPT_NAME"]);
0010: 
0011: /**
0012:  * IPアドレスかどうか検査する
0013:  * @param string $str チェックするテキスト
0014:  * @return string IPアドレス/FALSE(IPアドレスではない)
0015: */
0016: function is_ipadr($str) {
0017:     $pat = "/^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/";
0018:                                                 //IPアドレスを表す正規表現
0019:     preg_match($pat$str$regs);
0020: 
0021:     //定義域チェック (0 ≦ IP ≦ 255)
0022:     for ($i = 1; $i <= 4; $i++) {
0023:         if (!isset($regs[$i]))  return FALSE;
0024:         if ($regs[$i] < 0 || $regs[$i] > 255)   return FALSE;
0025:     }
0026: 
0027:     return $regs[0];
0028: }
0029: 
0030: /**
0031:  * ホスト名どうか検査する
0032:  * @param string $str チェックするテキスト
0033:  * @return string ホスト名/FALSE(ホスト名ではない)
0034: */
0035: function is_host($str) {
0036:     $pat = "/(https?:\/\/)?([\-\_\.\!~\*'\(\)a-zA-Z0-9\;\?\@\&\=\+\$\,%#]+)/";
0037:                                                 //URLを表す正規表現
0038:     if (preg_match($pat$str$regs) != 1)       return FALSE;
0039: 
0040:     return $regs[2];
0041: }
0042: 
0043: // メイン処理 ==============================================================
0044: $sour = isset($_POST["sour"]) ? $_POST["sour"] : "";
0045: $sour = htmlspecialchars($sour);            //XSS対策
0046: 
0047: if (isset($_POST["reset"]))       $sour = "";
0048: 
0049: if ($sour == "") {
0050:     $msg == "";
0051: else if (($ip = is_ipadr($sour)) != FALSE) {
0052:     $host = gethostbyaddr($ip);
0053:     if ($host != $ip) {
0054:         $msg = "ホスト名は <input type=\"text\" name=\"dest\" size=\"40\" value=\"{$host}\" /> です\n";
0055:         $msg .= " <button onClick=\"copyText()\">コピー</button>\n";
0056:     } else {
0057:         $msg = "ホスト名に変換できませんでした";
0058:     }
0059: else if (($host = is_host($sour)) != FALSE) {
0060:     $ip = gethostbyname($host);
0061:     if ($host != $ip) {
0062:         $msg = "IPアドレスは <input type=\"text\" name=\"dest\" size=\"20\" value=\"{$ip}\" /> です\n";
0063:         $msg .= " <button onClick=\"copyText()\">コピー</button>\n";
0064:     } else {
0065:         $msg = "IPアドレスに変換できませんでした";
0066:     }
0067: else {
0068:     $msg = "解析できません";
0069: }
0070: 
0071: // 表示処理 =================================================================
0072: echo <<< EOF
0073: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
0074:  "http://www.w3.org/TR/html4/loose.dtd">
0075: <html lang="ja">
0076: <head>
0077: <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
0078: <title>IPアドレス←→ホスト名 相互変換</title>
0079: <script language="JavaScript">
0080: <!--
0081: //destの内容をクリップボードへ(IEのみ)
0082: function copyText() {
0083:     var text1 = document.myForm.dest.value;
0084:     clipboardData.setData("Text", text1);
0085: }
0086: -->
0087: </script>
0088: </head>
0089: <body>
0090: <h1>■IPアドレス←→ホスト名 相互変換</h1>
0091: 
0092: <form name="myForm" method="post" action="$myself">
0093: <p>
0094: IPアドレスまたはホスト名:
0095: <input type="text" name="sour" size="80" value="$sour" />
0096: <input type="submit" name="check" value="変換" />
0097: </p>
0098: <p>
0099: {$msg}
0100: </p>
0101: <input type="submit" name="reset" value="リセット" />
0102: </form>
0103: <hr />
0104: <b>【使い方】</b>
0105: <ol>
0106: <li>[IPアドレスまたはホスト名]に変換したいIPアドレスまたはホスト名(URL表記も可)を入力してください。</li>
0107: <li>[変換]ボタンを押してください。</li>
0108: <li>対応するホスト名またはIPアドレスが表示されます。</li>
0109: <li>[コピー]ボタンを押すと、変換後の内容がクリップボードにコピーされます。(InternetExplorerのみの機能)</li>
0110: <li>[リセット]ボタンを押すと、表示がクリアされます。</li>
0111: </ol>
0112: </body>
0113: </html>
0114: EOF;
0115: ?>

プログラムを実行する

サンプル・プログラムの解説

プログラムの流れは、 「正規表現でURLをリンクに変換する」 および 「正規表現でIPアドレスかどうか調べる」 とほとんど同じである。

与えられた文字列が IP アドレスだったら(51行目)、IP アドレス部分を取り出して gethostbyaddr 関数 によってホスト名に変換する。
また、与えられた文字列がホスト名だったら(59行目)、ホスト名部分を取り出して gethostbyname 関数 によって IP アドレスに変換する。
いずれにもマッチしない場合は解析不能としてエラーメッセージを表示する(68行目)。

さらに whois 検索を行いたいのであれば、pearNet_Whois::query() を利用するとよい。

(この項おわり)