
とあるサイトで、
「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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPメールフォーム URLと半角...
-
PHPで変数から1行目だけを取得...
-
正規表現でシングルクォーテー...
-
電話番号のチェック ハイフン...
-
PHPの正規表現で住所を分けるに...
-
C#でのワイルドカードを使った...
-
カンマ区切りの金額を検索する...
-
、"(ダブルクォーテーション)...
-
preg_match関数で4-16桁の英数...
-
PHPで あるフォルダ内の、特定...
-
preg_matchでエラーが出ます。
-
正規表現/Uについて
-
VBAのコマンドボタンの文字列の...
-
全角括弧と全角読点の間隔を狭...
-
エクセルのCOUNTIFが正しくカウ...
-
ソースコードの1行が長いとき...
-
メッセージボックスで1025文字...
-
【VBA】エクセルで最後の不要な...
-
グレープシティのSPREAD...
-
C#の改行について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
、"(ダブルクォーテーション)...
-
VBAを使ってHTMLソースから特定...
-
Excelで数字のみを2倍3倍にする...
-
preg_matchでエラーが出ます。
-
PHPで<a>タグ内からURLと文字を...
-
PHPで変数から1行目だけを取得...
-
正規表現で「0」のみ抽出
-
PHPメールフォーム URLと半角...
-
C#でのワイルドカードを使った...
-
正規表現でシングルクォーテー...
-
住所から特定の文字列、数値を...
-
電話番号のチェック ハイフン...
-
Smartyで部分一致
-
正規表現パターンの記入方法に...
-
PHPによるIPアドレスマッチ
-
PHPの正規表現で住所を分けるに...
-
preg_matchの正規表現で
-
preg_replace_callback が渡す...
-
正規表現 許可文字列 かつ ...
-
phpでhtmlソースを解析し、文字...
おすすめ情報