質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2165閲覧

URLからドメインを取得したい

pinkpink

総合スコア7

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/11/05 06:23

URLからドメイン部分
sample.netをマッチさせ出力したいのですが、動きません
どうしたら動きますでしょうか?

<?php $url="http://www.sample.net/index.html"; //$url="https://sample.net/index.html";どちらもマッチさせたい // URLからホスト名を取得 preg_match("/^(http://)?([^/]+)/i", $url, $matches); $host = $matches[2]; // ホストからドメインを取得 preg_match("/[^./]+.[^./]+$/", $host, $matches); echo "domain name is: {$matches[0]}\n"; ?>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

当初の回答

parse_url()を使いましょう
リンクのサンプルコードを読めば使い方は分かると思います。


当初の回答では、プロトコルに関わらずFQDN部分を取得したいという質問だと認識しての回答でした。
質問としては、それに加えてホスト部(www)を除外したいという要件があるように見受けられるので以下を追記します。

上記要件の場合、
TLD、gTLD、ccTLDはそれぞれ階層が異なり(例えば.jpと.co.jp)、かつ新しいものが追加されるので全てを正規表現で解決するのは恐らく不可能です。
そのため、アプローチとしては

  1. TLD、gTLD、ccTLDの一覧をシステム内に持って常にメンテナンスする
  2. 階層が深い順にマッチさせ、マッチした場合はそれより上部分をドメインと判断する
  3. ホスト部はドメインがホスト部を持つ(=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:33

編集2021/11/05 07:35
tanat

総合スコア18716

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanat

2021/11/05 06:45

解決しちゃいましたが、この回答は質問を誤読していたように思いますので後ほど追記します
pinkpink

2021/11/06 01:52

どうもありがとうございます 参考にして自分でも研究したいと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問