
とあるサイトで、
「URL からドメイン名を得る」という項目があったのでマネして
やってみたらうまくいきました。しかし正規表現パターンの意味は
理解できませんでしたので理解できなかった部分だけをのせたスクリプトを以下にまとめました。
<?php
// まずUPLからホスト名を得る
preg_match('@^(?:http://)?([^/]+)@i',
"http://www.nantoka.com/index.html", $matches);
$zenbu=$matches[0];
$host = $matches[1];
$saigo=$matches[2];
/*必要なのはホスト名だけですが、$matches[0]や$matches[2]には
どんな文字列が格納されるか気になって出力することにしました*/
print($zenbu);
print("<br/>");
print($host);
print("<br/>");
print($saigo);
print("<br/>");
?>
これを実行した結果は、
$zenbuが「http://www.nantoka.com」で、
$hostが「www.nantoka.com」で、
$saigoがなにもなしでした。
このスクリプトでわからない部分は、'@^(?:http://)?([^/]+)@i'の部分と、$host = $matches[1];の部分です。
まず正規表現パターンの最初のアットマークの後ろの^は「次の文字列からはじまる」と解釈しました。
最後のアットマークの後ろのiは、「大文字と小文字を区別しない」という意味だと解釈しました。
カッコで囲まれている(?:http://)と、([^/]+)は、サブマッチパターン
だと思いました。
$matches[0]には、"http://www.nantoka.com/index.html"の
中で'@^(?:http://)?([^/]+)@i'に当てはまるもの全体が格納され、
$matches[1]には、(?:http://)に当てはまるもの、
$matches[2]には、([^/]+)に当てはまるものが格納されると考えました。
[^/]+は、「スラッシュを含まない文字が1文字以上」と解釈しました。
ただ、その他の事については考えましたがよくわからず、
特になんで(?:http://)にあたるものが「www.nantoka.com」
になるのかさっぱりわかりません。
(?:http://)の中にあるhttp://の前の?:が一体何なのか、
(?:http://)と([^/]+)の間にある?は何なのか、
両端のアットマークは何なのか(マッチ演算子かと思って
スラッシュに置き換えて実行してみたらエラーになりました。)
うまく説明できませんがとにかくその辺のことがよくわかりませんでした。どなたか教えていただけませんか。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
と、その他の部分も補足します。
まず、@ですが、正規表現のマッチングの場合、マッチング対象を囲みます。
通常は、「/」を使うのですが、今回のマッチング文字列の中に「/」が含まれているため、代替として「@」を使っているのだと思います。
マッチ演算子として、「/」に戻した場合、内部の「http://」の「/」を¥マークでエスケープしないとエラーになってしまうと思います。
つづいて、(?:http://)の後の?ですが、これは「この?の前にあるブロックが、0~1回出てくること」という条件になります。
なので、http://http://aaaという文字列を入れた場合、http://を1回分だけよりわける、ということが出来るようになります。
エラーの詳細まで教えていただき感謝しています。
http://の後の?についても確かめてみました、
(なんのためにhttp://が2つもあったりhttp://がなかったりするのか
はよくわかりませんが、検索したら実際にそういうものがありますね。)
No.2
- 回答日時:
@はここでは、正規表現の始まりと終わりを示すものとして使われています。
通常この目的には '/' が使われることが多いのですが、今回マッチングに
使用するパターンに '/' が複数含まれているのでエスケープのバックスラッシュを
多用することによって見づらくなるのを避けるために'@' を使用したのでしょう。
$matches[0], $matches[1], $matches[2], ... ですが
0 → パターンにマッチした全体
1 → 1番目のサブパターンに捕獲された部分文字列
2 → 2番目のサブパターンに捕獲された部分文字列
となります。ここで、(?: ) と ( ) とは違うものだということに注意してください。
(?: ) によりグループ化された場合、捕獲はなされません。つまり、
> $matches[1]には、(?:?http://)?に当てはまるもの、
> $matches[2]には、([^/]+)に当てはまるものが格納されると考えました。
これがひとつずれます。$matches[1] には ([^/]+)によって捕獲されたものであり、
このパターンには捕獲を行うグループ化はひとつしかありませんので、
$matches[2]は常に空になります。
順番が前後しましたが、'(?:' の三文字で捕獲をしないグループ化を表す
メタ文字になってます。ですので '?:' それ自体に意味はありません。
No.1
- 回答日時:
まさにossuさんがわからない、といっていた「?:」がこの部分の肝となります。
(?:~~~)とすると、この括弧の部分を検索時のマッチ対象から外すことが出来るようになります。
このため、$matches[1]に本来、$matches[2]に入る内容が入ってくることになります。
詳しくは、PHPマニュアルをご覧下さい。
参考URL:http://search.net-newbie.com/php/reference.pcre. …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP preg_matchで Warning: Undefined variableが出ます 1 2022/11/15 17:06
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP PHP MySql ページング 2 2022/09/20 06:38
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- その他(コンピューター・テクノロジー) 正規表現の置換で一部の文字列をそのまま残したい 2 2022/05/03 19:19
- 日本語 〈場所を示す「に」と「で」〉 という誤り 36 2022/11/12 15:04
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHP8でWarning:Undefined varia...
-
composerをインストールしたい...
-
phpの問い合わせフォームを作っ...
-
配列の値の更新方法について
-
PHPの構文で間違えが分からない
-
SFTPなどは使わないホームペー...
-
$_SESSIONに渡した後はそのまま...
-
($_POST['email']??"", ・・・...
-
phpのエラーについて
-
PHP MySql 画像を取得
-
marginの値でマイナス値を設定...
-
submitで思うようにページが遷...
-
HTML PHP ラジオボタンのイベント
-
php でqiitaのサイトにあったフ...
-
SplFileObject を利用したとき...
-
PHPの勉強してます。 配列のと...
-
BASIC認証のフォームをデザイン...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
返信機能のツリー構造の深さを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
phpの問い合わせフォームを作っ...
-
composerをインストールしたい...
-
PHP8でWarning:Undefined varia...
-
marginの値でマイナス値を設定...
-
phpでcookieがうまく保存されない
-
SplFileObject を利用したとき...
-
PHPSpreadsheetを使って関数を...
-
PHPSpreadsheetによる書き出し...
-
PHP8を使うと、大量のWarningが...
-
フォームで戻った際に入力済み...
-
PostgreSQLからCSV形式でエクス...
-
PHPを使って、別サイトの一部を...
-
BASIC認証のフォームをデザイン...
-
入力した部分を表示させたまま...
-
【初心者】XAMPPのapacheの(恐...
-
ログイン機の付きの掲示板サイ...
-
ワードプレスサイト PHP8.0.25...
-
Postgresの特定のカラムからス...
-
PHPで画像の渡しが上手く行きま...
-
PHPの勉強してます。 配列のと...
おすすめ情報