アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記の意味が分かりません。
( !empty($_SERVER['SERVER_NAME']) && preg_match('#^(?:[a-z0-9\-]+\.){1,}[a-z]{2,}$#i', $_SERVER['SERVER_NAME']) ) ? preg_replace('#^www\.#', '.', $_SERVER['SERVER_NAME']) : '';

<分かる範囲>
$_SERVER['SERVER_NAME']が空ではなく、かつ、$_SERVER['SERVER_NAME']の中に'#^(?:[a-z0-9\-]+\.){1,}[a-z]{2,}$#i'があったら、$_SERVER['SERVER_NAME']の中の'#^www\.#'を'.'へ置き換え

<知りたいこと>
正規表現の所の意味と、結局、この一文で何をしようとしている(と予想される)か、教えてください

A 回答 (1件)

正規表現の意味は、


# perl互換の場合、 / の代わりに、パターン括りに # を使える
^ 先頭
(?:[a-z0-9\-]+\.) ()で、ひとまとめのサブパターン
? は複数の意味がありますが、手前が開始用丸括弧で、後方に : が続くので、「値のキャプチャをしないサブパターン」でしょう。
[a-z0-9\-] a-z または 0-9 または '-'文字 のいずれか1文字
+ 手前の文字種が1文字以上
\.  '.'文字
(?:[a-z0-9\-]+\.){1,}  () 内のパターンが一回以上あること、キャプチャしないことにより、実行時間を少々早くしている。
[a-z]{2,}  a-z のいずれかの文字が 2個以上
$ 終端
i パターン修飾子: ##で括られたパターンの中の文字は 大文字にも小文字にもマッチ

よって、 a-z または 0-9 または '-' のいずれかの文字が1文字以上に '.'文字の続くパターンが一つ以上有って、最後に 2文字以上のアルファベットが続くものにマッチ

利用目的:実行serverアプリによっては、localhost アクセスだとドメイン名を含まないことがあるけど(windowsだとコンピューター名が入っていたりする)、きちんとドメイン名が付いてる(間に '.' が入っている)ときに、さらに次のreplaceを実行する。
前後関係が不明だけど、予想としては、apache でvirtual host 実行時に www.host名 で、default hostにアクセスするけど、このときに別のvirtual host名に切り替えてリンクを作成しようとしてるってとこでしょうか。

正規表現の詳細は以下を参照してください
http://jp.php.net/manual/ja/reference.pcre.patte …
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

丁寧に解説していただき、大変参考になりましたー

お礼日時:2012/01/06 09:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!