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