質問するログイン新規登録

質問編集履歴

4

コード修正

2016/03/30 10:45

投稿

flat
flat

スコア617

title CHANGED
File without changes
body CHANGED
@@ -47,7 +47,7 @@
47
47
 
48
48
  if (strlen($arr[1]) > 2) {
49
49
  $domain = implode('.', array_reverse(array_slice($arr, 0, 2)));
50
- } elseif ($arr[0] === 'jp' && strlen($arr[1]) < 3) {
50
+ } elseif (strlen($arr[1]) < 3) {
51
51
  $domain = implode('.', array_reverse(array_slice($arr, 0, 3)));
52
52
  } else {
53
53
  $domain = 'unknown';

3

コード修正

2016/03/30 10:45

投稿

flat
flat

スコア617

title CHANGED
File without changes
body CHANGED
@@ -45,7 +45,7 @@
45
45
 
46
46
  $arr = array_reverse(explode('.', $hostname));
47
47
 
48
- if ($arr[0] !== 'jp' && strlen($arr[1]) > 2) {
48
+ if (strlen($arr[1]) > 2) {
49
49
  $domain = implode('.', array_reverse(array_slice($arr, 0, 2)));
50
50
  } elseif ($arr[0] === 'jp' && strlen($arr[1]) < 3) {
51
51
  $domain = implode('.', array_reverse(array_slice($arr, 0, 3)));

2

追記

2016/03/30 10:43

投稿

flat
flat

スコア617

title CHANGED
File without changes
body CHANGED
@@ -19,4 +19,46 @@
19
19
  }
20
20
 
21
21
  // さてここからどうしよう……という状態です。
22
+ ```
23
+
24
+ **追記2**
25
+ ngyukiさんの回答にあるコードを参考に試行錯誤していたのですが、色々と妥協していった結果、今回は省コストであることを優先することにしました。
26
+ コードは最終的に次のようになりました。
27
+ ```PHP
28
+ $hostname1 = 'teratail.com'; // teratail.com
29
+ $hostname2 = 'www.example.com'; // example.com
30
+ $hostname3 = 'www.example.jp'; // example.jp
31
+ $hostname4 = 'www.example.co.jp'; // example.co.jp
32
+ $hostname5 = 'xxx.yyy.www.example.ne.jp'; // example.ne.jp
33
+ $hostname6 = 'xxx.yyy.www.example.tokyo.jp'; // tokyo.jp
34
+ $hostname7 = 'tokyo.jp'; // tokyo.jp
35
+ $hostname8 = 'oreore.areare'; // oreore.areare
36
+
37
+ /**
38
+ * @param string $hostname ホスト名
39
+ * @return string 一般的なドメインであればドメイン名を、そうでない場合はunknownを返す
40
+ */
41
+ function narrow_down_domain($hostname) {
42
+ if ($hostname === 'unknown') {
43
+ return $hostname;
44
+ }
45
+
46
+ $arr = array_reverse(explode('.', $hostname));
47
+
48
+ if ($arr[0] !== 'jp' && strlen($arr[1]) > 2) {
49
+ $domain = implode('.', array_reverse(array_slice($arr, 0, 2)));
50
+ } elseif ($arr[0] === 'jp' && strlen($arr[1]) < 3) {
51
+ $domain = implode('.', array_reverse(array_slice($arr, 0, 3)));
52
+ } else {
53
+ $domain = 'unknown';
54
+ }
55
+
56
+ return $domain;
57
+ }
58
+
59
+ /**
60
+ * 都道府県型JPドメインおよび地域型ドメイン(またはそれに類するドメイン)は諦める
61
+ * つまり、正確に取得することは諦める
62
+ * $hostname8 のようなケースは、ホスト名を取得する段階の処理で、信頼できないホスト名だった場合は'unknown'を返すようにする事で対処する
63
+ */
22
64
  ```

1

追記

2016/03/30 10:39

投稿

flat
flat

スコア617

title CHANGED
File without changes
body CHANGED
@@ -1,15 +1,21 @@
1
1
  ホスト名からドメインの部分だけを取り出したいと思い、まだ途中ですが次のようなコードを書きました。
2
2
  しかし、ドメインがTLDだけなら話は簡単なのですが、SLDも想定しなければいけないため頭を悩ませています。
3
3
  とりあえず余計な部分を削ぎ落とすところまでは考えたのですが、ここからSLDが無い場合でもドメインのみの状態にするにはどのような処理が必要でしょうか?
4
+
5
+ **追記**
6
+ この処理で私が今回行おうとしている事は、サーバーにアクセスしてきたホストのドメインを取得する(だけ)というものです。(正引きで確認済み)
7
+ つまりプロバイダなどの通信事業者を経由したアクセスを想定しているので、よく考えると地域型ドメインは考慮しなくても良いです。(多分……)
4
8
  ```PHP
5
9
  $hostname1 = 'www.example.com'; // example.com
6
10
  $hostname2 = 'www.example.co.jp'; // example.co.jp
7
11
  $hostname3 = 'xxx.yyy.www.example.tokyo.jp'; // example.tokyo.jp
12
+ $hostname4 = 'www.example.shibuya.tokyo.jp'; // example.shibuya.tokyo.jp
8
13
 
9
- $arr = array_reverse(explode('.', $hostname3), TRUE);
14
+ $arr = array_reverse(explode('.', $hostname4), TRUE);
10
15
 
16
+ // 地域型ドメインだと4レベルドメインになる事を考慮
11
- if (count($arr) > 3) {
17
+ if (count($arr) > 4) {// 3 だったのを 4に変更
12
- array_splice($arr, 3);
18
+ array_splice($arr, 4);// 3 だったのを 4に変更
13
19
  }
14
20
 
15
21
  // さてここからどうしよう……という状態です。