[PHP] Whois情報を取得

Whois情報を取得する方法
・$domainは「確認したいドメイン」、$serverはそのドメインの「Whoisサーバー」。
・「Whoisサーバー」については、whoisサーバ一覧を参照。

<?php
require_once 'Net/Whois.php';
$whois = new Net_Whois;
$data = $whois->query($domain, $server);
echo nl2br($data);
?>

空きドメイン検索する方法

<?php

/**
 * 初期化
 */
$title = 'Whois情報検索'; // ページタイトル
$top = ''; // 第1レベル・ドメイン
$second = ''; // 第2レベル・ドメイン
$error = ''; // エラーメッセージ
$match1 = ''; // 正規表現のチェック1
$match2 = ''; // 正規表現のチェック2
$match3 = ''; // 正規表現のチェック3
$match4 = ''; // 正規表現のチェック4
$whois = ''; // Net_Whoisクラスのオブジェクト
$data = ''; // Whois情報
$check = ''; // 空きドメインの可否を確認するための値
$res = ''; // 空きドメイン検索の結果

/**
 * 関数
 */
//トップレベル・ドメインとWhoisサーバーの配列
function getWhoisServers ($top = null) {
	$servers = array(
		'.jp'   => 'whois.jprs.jp',
		'.com'  => 'whois.verisign-grs.com',
		'.net'  => 'whois.verisign-grs.com',
		'.org'  => 'whois.publicinterestregistry.net',
		'.info' => 'whois.afilias.info',
		'.biz'  => 'whois.neulevel.biz',
		'.mobi' => 'whois.dotmobiregistry.net',
		'.asia' => 'whois.nic.asia',
		'.tv'   => 'tvwhois.verisign-grs.com',
	);
	if (!empty($top) && in_array($top, array_keys($servers))) {
		return $servers[$top];
	} else {
		return $servers;
	}
}

//ドメイン等の値を整形する関数
function trimWhoisDomain ($val) {
	$val = trim($val); //前後の半角スペースがある場合 削除
	$val = str_replace(array('ー','ー', '_'),array('-','-', ''), $val); //長音記号がある場合ハイフンに置換、アンダースコアは削除
	$val = mb_convert_kana($val,'a'); //全角英数字がある場合 半角に変換
	$val = strtolower($val);
	return $val;
}

//自動的に検出するエンコーディング
function getWhoisEncodings ($type) {
	switch ($type) {
		case 'string':
			$encodings = 'ASCII, JIS, UTF-8, EUC-JP, SJIS, ISO-2022-JP';
			break;
		case 'array':
			$encodings = array('UTF-8',  'JIS', 'EUC-JP', 'SJIS');
	}
	return $encodings;
}

/**
 * 処理
 */
if (!empty($_POST)) {
	// 整形して変数に格納。
	list($second, $top) = array_map('trimWhoisDomain', array($_POST['second'], $_POST['top']));
	// 正規表現で検証。
	// $secondの値が半角英数字とハイフンとドットのみで構成された合計3~63文字の文字列(先頭と最後は半角英数字)で、かつ、ハイフンを連続して使用していない場合。
	// (正規表現の中でグループ化をおこなった場合、マッチしていなくても空の配列が返されるので$match1[0]で結果を確認する。)
	preg_match('/^[a-z0-9][a-z0-9-.]{1,61}[a-z0-9]$/i', $second, $match1);
	preg_match('/\-{2,}/', $second, $match2);
	preg_match('/\.{2,}/', $second, $match3);
	preg_match('/^.[a-z]{2,4}$/i', $top, $match4);

	// バリデーション。
	// 第2レベル・ドメイン。
	if (empty($second)) {
		$error['second'] = '第2レベル・ドメインをテキストフィールドに入力してください。';
	} elseif (empty($match1[0])) {
		$error['second'] = '半角英数字と-(ハイフン)と.(ドット)のみを使用し、3〜63文字で入力してください。'.PHP_EOL.'-(ハイフン)や.(ドット)を、先頭や最後に使用することはできません。';
	} elseif (!empty($match2[0])) {
		$error['second'] = '-(ハイフン)を連続して使用することはできません。';
	} elseif (!empty($match3[0])) {
		$error['second'] = '.(ドット)を連続して使用することはできません。';
	}
	// 第1レベル・ドメイン
	if (empty($top)) {
		$error['top'] = '第1レベル・ドメインをプルダウンから選択してください';
	} elseif (!in_array($top, array_keys(getWhoisServers())) || empty($match4[0])) {
		$error['top'] = '第1レベル・ドメインは正しく入力してください。';
	}

	// バリデーションを通過した場合。
	if (empty($error)) {
		require_once 'Net/Whois.php';
		$whois = new Net_Whois;
		$data = $whois->query($second.$top, getWhoisServers($top)); // 第1引数に検索するドメイン, 第2引数にWhoisサーバーを渡し、Whois情報を取得。
		$data = mb_convert_encoding($data, 'UTF-8', getWhoisEncodings('string')); // 文字コードを変換

		// 空きドメインか否かの確認。
		// Whois情報の中で確認する文字列
		if (in_array($top, array('.jp', '.com', '.net', '.tv'))) {
			$check = 'No\smatch';
		} elseif (in_array($top, array('.org', '.info', '.mobi', '.asia'))) {
			$check = 'NOT\sFOUND';
		} elseif (in_array($top, array('.biz'))) {
			$check = 'Not\sfound';
		}
		//空きドメイン検索の結果
		if (preg_match('/'.$check.'/', $data)) {
			$res = '[ '.$second.$top.'] 取得可能';
		} else {
			$res = '[ '.$second.$top.'] 取得不可';
		}
	}
}

?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title><?php echo $title ?></title>
</head>
<body>

<h1><?php echo $title ?></h1>

<form action="<?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'] ?>" method="post">
  <?php echo !empty($error['second']) ? nl2br(htmlspecialchars($error['second']), ENT_QUOTES, 'UTF-8').'<br />' : null; ?>
  <?php echo !empty($error['top']) ? nl2br(htmlspecialchars($error['top']), ENT_QUOTES, 'UTF-8').'<br />' : null; ?>
  <input type="text" name="second" value="<?php echo !empty($second) ? htmlspecialchars($second, ENT_QUOTES, 'UTF-8') : null ?>" maxlength="60" />
  <select name="top">
    <option value="">選択してください</option>
    <?php foreach(getWhoisServers() as $key => $value) { ?>
    <option value="<?php echo htmlspecialchars($key, ENT_QUOTES, 'UTF-8') ?>" <?php if($top == $key){ ?> selected="selected" <?php } ?>>
    <?php echo htmlspecialchars($key, ENT_QUOTES, 'UTF-8')?>
    </option>
    <?php } ?>
  </select>
  <input type="submit" value="Whois情報を調べる" />
</form>

<?php echo !empty($res) ? '<p><strong>'.nl2br(htmlspecialchars($res, ENT_QUOTES, 'UTF-8')).'<strong></p>' : null ?>

<?php echo !empty($data) ? nl2br(htmlspecialchars($data, ENT_QUOTES, 'UTF-8')) : null ?>

</body>
</html>
HatenaGoogle BookmarksYahoo BookmarksFacebook

コメントする

*