前回の応用として、 与えられた文字列が 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 検索を行いたいのであれば、pear の Net_Whois::query() を利用するとよい。
| 2007年03月09日更新 | ||
| <<前へ | <目次> | 次へ>> |
| 戻る | 【関連ページ】 | |