ホスト名からドメインの部分だけを取り出したいと思い、まだ途中ですが次のようなコードを書きました。
しかし、ドメインがTLDだけなら話は簡単なのですが、SLDも想定しなければいけないため頭を悩ませています。
とりあえず余計な部分を削ぎ落とすところまでは考えたのですが、ここからSLDが無い場合でもドメインのみの状態にするにはどのような処理が必要でしょうか?
追記
この処理で私が今回行おうとしている事は、サーバーにアクセスしてきたホストのドメインを取得する(だけ)というものです。(正引きで確認済み)
つまりプロバイダなどの通信事業者を経由したアクセスを想定しているので、よく考えると地域型ドメインは考慮しなくても良いです。(多分……)
PHP
1$hostname1 = 'www.example.com'; // example.com 2$hostname2 = 'www.example.co.jp'; // example.co.jp 3$hostname3 = 'xxx.yyy.www.example.tokyo.jp'; // example.tokyo.jp 4$hostname4 = 'www.example.shibuya.tokyo.jp'; // example.shibuya.tokyo.jp 5 6$arr = array_reverse(explode('.', $hostname4), TRUE); 7 8// 地域型ドメインだと4レベルドメインになる事を考慮 9if (count($arr) > 4) {// 3 だったのを 4に変更 10 array_splice($arr, 4);// 3 だったのを 4に変更 11} 12 13// さてここからどうしよう……という状態です。
追記2
ngyukiさんの回答にあるコードを参考に試行錯誤していたのですが、色々と妥協していった結果、今回は省コストであることを優先することにしました。
コードは最終的に次のようになりました。
PHP
1$hostname1 = 'teratail.com'; // teratail.com 2$hostname2 = 'www.example.com'; // example.com 3$hostname3 = 'www.example.jp'; // example.jp 4$hostname4 = 'www.example.co.jp'; // example.co.jp 5$hostname5 = 'xxx.yyy.www.example.ne.jp'; // example.ne.jp 6$hostname6 = 'xxx.yyy.www.example.tokyo.jp'; // tokyo.jp 7$hostname7 = 'tokyo.jp'; // tokyo.jp 8$hostname8 = 'oreore.areare'; // oreore.areare 9 10/** 11 * @param string $hostname ホスト名 12 * @return string 一般的なドメインであればドメイン名を、そうでない場合はunknownを返す 13 */ 14function narrow_down_domain($hostname) { 15 if ($hostname === 'unknown') { 16 return $hostname; 17 } 18 19 $arr = array_reverse(explode('.', $hostname)); 20 21 if (strlen($arr[1]) > 2) { 22 $domain = implode('.', array_reverse(array_slice($arr, 0, 2))); 23 } elseif (strlen($arr[1]) < 3) { 24 $domain = implode('.', array_reverse(array_slice($arr, 0, 3))); 25 } else { 26 $domain = 'unknown'; 27 } 28 29 return $domain; 30} 31 32/** 33 * 都道府県型JPドメインおよび地域型ドメイン(またはそれに類するドメイン)は諦める 34 * つまり、正確に取得することは諦める 35 * $hostname8 のようなケースは、ホスト名を取得する段階の処理で、信頼できないホスト名だった場合は'unknown'を返すようにする事で対処する 36 */
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/29 14:08