回答編集履歴

1

追記

2021/11/05 07:35

投稿

tanat
tanat

スコア18778

answer CHANGED
@@ -1,2 +1,68 @@
1
+ 当初の回答
2
+ ---
3
+
1
4
  [parse_url()](https://www.php.net/manual/ja/function.parse-url.php)を使いましょう
2
- リンクのサンプルコードを読めば使い方は分かると思います。
5
+ リンクのサンプルコードを読めば使い方は分かると思います。
6
+
7
+ ---
8
+ 当初の回答では、プロトコルに関わらずFQDN部分を取得したいという質問だと認識しての回答でした。
9
+ 質問としては、それに加えてホスト部(www)を除外したいという要件があるように見受けられるので以下を追記します。
10
+
11
+ 上記要件の場合、
12
+ TLD、gTLD、ccTLDはそれぞれ階層が異なり(例えば.jpと.co.jp)、かつ新しいものが追加されるので全てを正規表現で解決するのは恐らく不可能です。
13
+ そのため、アプローチとしては
14
+ 1. TLD、gTLD、ccTLDの一覧をシステム内に持って常にメンテナンスする
15
+ 2. 階層が深い順にマッチさせ、マッチした場合はそれより上部分をドメインと判断する
16
+ 3. ホスト部はドメインがホスト部を持つ(=FQDNからTLD等を削除した後に.が一つ以上ある)のみ削除する
17
+ という感じにならざるを得ないかなと思われます。
18
+
19
+ ```PHP
20
+ <?php
21
+ // Your code here!
22
+ $url="http://www.sample.net/index.html";
23
+ $fqdn = parse_url($url,PHP_URL_HOST);
24
+ echo removeHostName($fqdn).PHP_EOL;
25
+
26
+ $url="https://sample.net/index.html";
27
+ $fqdn = parse_url($url,PHP_URL_HOST);
28
+ echo removeHostName($fqdn).PHP_EOL;
29
+
30
+ $url="https://sample.co.jp/index.html";
31
+ $fqdn = parse_url($url,PHP_URL_HOST);
32
+ echo removeHostName($fqdn).PHP_EOL;
33
+
34
+ $url="http://www.sample.co.jp/index.html";
35
+ $fqdn = parse_url($url,PHP_URL_HOST);
36
+ echo removeHostName($fqdn).PHP_EOL;
37
+
38
+
39
+ function removeHostName($fqdn){
40
+ //想定するTLD,gTLD,ccTLDの一覧を作る
41
+ //ここでは長い順に定義しているが、階層ごとに分けて管理するとリストのメンテナンスが楽
42
+ $tldList = [".co.jp",".net",".jp"];
43
+ foreach($tldList as $tld){
44
+ if(strpos($fqdn,$tld) !== false){
45
+ //FQDNからtld,gTLD,ccTLDを削除
46
+ $domain = str_replace($tld,"",$fqdn);
47
+ //ドメインを.で分割
48
+ $tmp = explode(".",$domain);
49
+ if(count($tmp) > 1){
50
+ //ホスト部を持っている場合はホスト部を削除
51
+ array_shift($tmp);
52
+ }
53
+ return implode(".",$tmp).$tld;
54
+ }
55
+ }
56
+ return $fqdn;
57
+ }
58
+ /*
59
+ 実行結果
60
+ sample.net
61
+ sample.net
62
+ sample.co.jp
63
+ sample.co.jp
64
+
65
+
66
+ */
67
+
68
+ ```