質問編集履歴

4

コード修正

2016/03/30 10:45

投稿

flat
flat

スコア617

test CHANGED
File without changes
test CHANGED
@@ -96,7 +96,7 @@
96
96
 
97
97
  $domain = implode('.', array_reverse(array_slice($arr, 0, 2)));
98
98
 
99
- } elseif ($arr[0] === 'jp' && strlen($arr[1]) < 3) {
99
+ } elseif (strlen($arr[1]) < 3) {
100
100
 
101
101
  $domain = implode('.', array_reverse(array_slice($arr, 0, 3)));
102
102
 

3

コード修正

2016/03/30 10:45

投稿

flat
flat

スコア617

test CHANGED
File without changes
test CHANGED
@@ -92,7 +92,7 @@
92
92
 
93
93
 
94
94
 
95
- if ($arr[0] !== 'jp' && strlen($arr[1]) > 2) {
95
+ if (strlen($arr[1]) > 2) {
96
96
 
97
97
  $domain = implode('.', array_reverse(array_slice($arr, 0, 2)));
98
98
 

2

追記

2016/03/30 10:43

投稿

flat
flat

スコア617

test CHANGED
File without changes
test CHANGED
@@ -41,3 +41,87 @@
41
41
  // さてここからどうしよう……という状態です。
42
42
 
43
43
  ```
44
+
45
+
46
+
47
+ **追記2**
48
+
49
+ ngyukiさんの回答にあるコードを参考に試行錯誤していたのですが、色々と妥協していった結果、今回は省コストであることを優先することにしました。
50
+
51
+ コードは最終的に次のようになりました。
52
+
53
+ ```PHP
54
+
55
+ $hostname1 = 'teratail.com'; // teratail.com
56
+
57
+ $hostname2 = 'www.example.com'; // example.com
58
+
59
+ $hostname3 = 'www.example.jp'; // example.jp
60
+
61
+ $hostname4 = 'www.example.co.jp'; // example.co.jp
62
+
63
+ $hostname5 = 'xxx.yyy.www.example.ne.jp'; // example.ne.jp
64
+
65
+ $hostname6 = 'xxx.yyy.www.example.tokyo.jp'; // tokyo.jp
66
+
67
+ $hostname7 = 'tokyo.jp'; // tokyo.jp
68
+
69
+ $hostname8 = 'oreore.areare'; // oreore.areare
70
+
71
+
72
+
73
+ /**
74
+
75
+ * @param string $hostname ホスト名
76
+
77
+ * @return string 一般的なドメインであればドメイン名を、そうでない場合はunknownを返す
78
+
79
+ */
80
+
81
+ function narrow_down_domain($hostname) {
82
+
83
+ if ($hostname === 'unknown') {
84
+
85
+ return $hostname;
86
+
87
+ }
88
+
89
+
90
+
91
+ $arr = array_reverse(explode('.', $hostname));
92
+
93
+
94
+
95
+ if ($arr[0] !== 'jp' && strlen($arr[1]) > 2) {
96
+
97
+ $domain = implode('.', array_reverse(array_slice($arr, 0, 2)));
98
+
99
+ } elseif ($arr[0] === 'jp' && strlen($arr[1]) < 3) {
100
+
101
+ $domain = implode('.', array_reverse(array_slice($arr, 0, 3)));
102
+
103
+ } else {
104
+
105
+ $domain = 'unknown';
106
+
107
+ }
108
+
109
+
110
+
111
+ return $domain;
112
+
113
+ }
114
+
115
+
116
+
117
+ /**
118
+
119
+ * 都道府県型JPドメインおよび地域型ドメイン(またはそれに類するドメイン)は諦める
120
+
121
+ * つまり、正確に取得することは諦める
122
+
123
+ * $hostname8 のようなケースは、ホスト名を取得する段階の処理で、信頼できないホスト名だった場合は'unknown'を返すようにする事で対処する
124
+
125
+ */
126
+
127
+ ```

1

追記

2016/03/30 10:39

投稿

flat
flat

スコア617

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