• ベストアンサー

preg_matchと定数について

preg_matchと定数について $string = "○○ドメイン"; if (preg_match("/$string/", $_SERVER['SERVER_NAME'])) {  echo "○"; } else {  echo "✕"; とやると○になるのですが、 define("DOMAIN", "○○ドメイン"); if (preg_match("/DOMAIN/", $_SERVER['SERVER_NAME'])) {  echo "○"; } else {  echo "✕"; } とすると、✕になります。 なぜでしょうか?

  • re999
  • お礼率61% (476/777)
  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5069/13245)
回答No.1

変数の場合 $ で始まるので変数名だと明示されているため処理ができますが、定数の場合ダブルクォーテーションのなかで使われると文字列なのか定数なのか判断する術が無いから、単なる文字列として扱われてしまいます。 if (preg_match("/".DOMAIN."/", $_SERVER['SERVER_NAME'])) { として使いましょう。

re999
質問者

お礼

回答&詳細な解説ありがとうございました。 おかげで無事動作しました!

関連するQ&A

  • preg_matchの使い方

    選択した画像ファイルをgifフォルダにアップロード保存して 同入力画面にも出力するサンプルの勉強をしています。 「preg_match」を使ってアップロードできるファイルを gif,jpg,pngに限定するというようにしたいのですが 使い方が間違っているようで上手く行きません。 どこが間違っているのでしょうか? よろしくお願いいたします。 ---------------------------------------------------------- <html> <body> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="data"> <input type="submit" value="表示"> </form> <?php $updir = "./gif/"; $filename = $_FILES["data"]["name"]; if(file_exists($_FILES["data"]["tmp_name"])){ $filesize = filesize($_FILES["data"]["tmp_name"]); if($filesize <= 100000){ if(preg_match("/\.gif$ | \.jpg$ | \.png$/", $filename)){ ←←※※※ move_uploaded_file($_FILES["data"]["tmp_name"], $updir.$filename); echo "ファイル名".$filename."アップロード成功!"; echo "<br><br>"; echo "<img src='./gif/$filename'>"; }else{ echo "jpg,pngもしくはgifのファイルしかアップできません。"; } }else{ echo "$filesize バイト。ファイルサイズが大きすぎます。"; } } ?> </body> </html> ----------------------------------------------------------

    • ベストアンサー
    • PHP
  • preg_matchについて

    初級者です。 初歩的な質問で申し訳ないですが質問させていただきます。 データベースのテーブルにある日付にマッチすれば"マッチ"、マッチしなければ"マッチなし"と表示させたく思っております。 ~DB内任意のフォームデータ~ 0405 0406 0407 ・ ・ ~~~~~~~~~~~~~~ そこで下記のスクリプトを作ったのですが、 この方法だとDBに登録されている日付の分だけ "マッチ" "マッチなし" ・ ・ と表示されてしまします。 ==test.php== <? //$keydayはリクエストのあった日付Ymd形式 //getRecList()に関しては別ファイルにてfunction済み //["日付"]というのは上記DBの日付の項目名 $reclist = getRecList(); foreach ($reclist as $rec) { $matchday = (date_format("Ymd",$rec["日付"])); unset($found); $found[0]=1; $matchecho ="マッチ"; $unmatchecho="マッチなし"; ?> <? if (preg_match("/$keyday/",$matchday)) { ?>  <? if (!array_key_exists($matchecho,$found)) { ?>   <? echo $matchecho ?><? $found[$matchecho] = 1; ?>  <? } ?> <? } else { ?>  <? if (!array_key_exists($unmatchecho,$found)) { ?>   <? echo $unmatchecho ?><? $found[$unmatchecho] = 1; ?>  <? } ?> <? } ?> <? } ?> ?> ======== やりたい事は、 DBに登録されている日付の数に左右されずマッチする日付があったら1回だけ"マッチ"と表示、 待ちしなければ1回だけ"マッチなし"と表示させたいのです。 ・・なんかforeachで回している事自体が間違いな気がしますが、どうかよろしくお願いいたします。

    • 締切済み
    • PHP
  • preg_matchでエラーが出ます。

    「PHP Warning: preg_match() expects parameter 2 to be string, array given in~」というエラーが出てきて困っています。 該当する行は下記です。 if( preg_match("/http:\/\/aa.com\//" , $url ) ) 真ならば上手く行くのですが、違うアドレスだった場合、エラーが出ます。 当方PHP初心者ですが、助言をお願いします。

    • ベストアンサー
    • PHP
  • preg_matchでの コンマ について 

    phpでの正規表現で 「もしも変数$wordへ入力した文字列が Japan's という文字列に一致すれば」というスクリプトを作成しましたが、うまくいきません。 if(preg_match("/japan\'s/i",$word,$match)){ この Japan's における カンマの取り扱いを このケースではどうしたらいいかよくわかりません。 \' としてみましたが、うまくいきません。 なにかアドバイスやヒントがありましたら、よろしくお願いします。 ああでもない、こうでもないとやってみましたが、その過程で 唯一 Japan's にヒットしたのは、次のスクリプトでした。 if($word=="japan\'s") ただし、これは正規表現は使っていないわけですよね。 なにか、自分のローカル環境に問題があるのかと思い、レンタルサーバーに同じものをuploadして試して見ましたが、やはり結果は同じで、ヒットしませんでした。別のパソコンでもやってみましたが、結果は同じでした。 整理しますと、 (preg_match("/japan's/i",$word,$match) ではヒットせず、よって コンマの前に\をつけて(preg_match("/japan\'s/i",$word,$match) としましたが、これもヒットしなかったということになります。 1) (')は正規表現の特殊文字でないはずですから、そのまま使えるはずだと思いましたが、なぜかこれが使えない。 2) しかも、その前にエスケープの \ をつけても、そのエスケープ が効かないのはなぜか。 追記: 最近分かったこと。 おもしろいことに、 'j すると、hitする。でも、j' とするとヒットしない。 ということは、コンマ自体には問題ないのだろうと推測しています。でも、文字の後にコンマがつくと、preg_matchにとって特別な意味を持つ文字列に変わるのではないか。

    • ベストアンサー
    • PHP
  • preg_matchによるカタカナチェックについて

    preg_matchによるカタカナチェックについて 宜しくお願い致します。 PHPのバージョン:4.4.1 文字コード:euc-jp preg_matchでカタカナのみ入力されているかをチェックしたいと思っております。 下記の様な感じで作ったのですが、ひらがなもスルーになってしまいます。 //会社名【カナ】の適合チェック if(preg_match("/[^ァ-ヶー]+/",$hoge_kana)) { print "カタカナ以外が含まれます"; } どうすればカタカナ以外が含まれた場合にチェックできるのでしょうか?

    • ベストアンサー
    • PHP
  • preg_match・ereg_replaceの動作について

    preg_matchとereg_matchの動作について調べています。 下記のスクリプトを実行すると、$stringが「代入テスト」となります。 ------------------------------------------- $v_insert = "代入" $string = "{%v_insert}テスト"; while (preg_match("/\{%(.*)\}/U", $string, $match)){ $string = ereg_replace($match[0], $$match[1], $a_subject); } ------------------------------------------- $$match[1]→$($match[1])→$(v_insert)となり、 $match[0]→/\{%(.*)\}/U $match[1]→v_insert $$match[1]→代入 となるのは分かったんですが、なぜ、$match[0]→/\{%(.*)\}/Uで$match[1]がv_insertになるのかが分かりません。 このスクリプトはどのように動き、どのように変数に値が設定されているのでしょうか。

    • ベストアンサー
    • PHP
  • preg_matchなどによる正規表現でUAを振り分ける・・・

    携帯サイトをユーザーエージェントで振り分ける為に、 preg_matchを利用したいのですが、 参考サイトを色々みていると、 1、preg_match("/CoCoMo/",$useragent) 2、preg_match("/^CoCoMo/",$useragent) という2パターンが存在して困っています。 どちらも正常に動くのですが、 どちらの記述が本当の正解と言えるのでしょうか? どうぞよろしくお願い致します。

    • 締切済み
    • PHP
  • preg_matrchとpreg_replace

    $settings['link_url3'] = preg_replace("/\//","\\\/",$settings['site_url3']); $url = "http://www.google.co.jp/"; $remote = @fopen($url, "r") or myerror("remote URLをオープンできません"); while ($html = fread($remote,1024)) { if (preg_match("/${settings['link_url3']}/i",$html)) {$found=$found + 1; break;} } という文があったのですが、preg_replaceとpreg_matchのところがいまいちよく解りません。 (preg_replaceとpreg_matchの中の /i とか /\// とか \\\/ の部分が・・・。)

    • ベストアンサー
    • PHP
  • PHPの正規表現 メール受信と文字コードについて

    Yahooのメールサーバに接続しメールを取得、メール本文に特定の語句が含まれているか調べたいのですが、うまく行かず悩んでいます。 SJIS文字コードが原因なんでしょうか? かなり長い文章になるので、お暇でしたらご教授下さい。 PHP Version 5.2.5です。 以下のプログラムでの問題点です。 <?php $mb=imap_open("{pop.mail.yahoo.co.jp:110/pop3}INBOX","ID","pass") or die("メールボックスを開けません<br>"); $i=4;//メール番号 //imap_fetchbody、mb_convert_encodingで取得した変数<$body_sjis>と比較する為、メール本文を変数<$mail_honbun>としてファイル内に定義。 $mail_honbun="次のことはを感じで、書きなさい。(すべて)手へんの漢字です。 「正解」はこのあとすぐ。仕上げの湾カールが決まるのは:エッセンシャルダメージケア新発売"; $body=imap_fetchbody($mb,$i,1,FT_PEEK);//本文取得 $body_sjis=mb_convert_encoding($body,"SJIS","auto");//SJISに変換 echo("$body_sjis<br><br><br>"); echo("[mail_honbunの場合]<br>"); if(preg_match("/次の.+書きなさい。/",$mail_honbun,$temp))//OK echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/次の.+正解/",$mail_honbun,$temp))//OK echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/エッセンシャル/",$mail_honbun,$temp))//OK echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/ダメージ/",$mail_honbun,$temp))//NG 何故ダメージはマッチしない? echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); echo("---------------------------------------<br>"); echo("[body_sjisの場合]<br>"); if(preg_match("/次の.+書きなさい。/",$body_sjis,$temp))//OK echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/書き.+正解/",$body_sjis,$temp))//NG 。を超えるとマッチしない echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/エッセンシャル/",$body_sjis,$temp))//OK エッセンシャルはOK echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/ダメージ/",$body_sjis,$temp))//NG ダメージがNG、何故? echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); ?> ## 結果 ######################################################## [mail_honbunの場合] 次のことはを感じで、書きなさい。 次のことはを感じで、書きなさい。(すべて)手へんの漢字です。 「正解 エッセンシャル NOT MATCH --------------------------------------- [body_sjisの場合] 次のことはを感じで、書きなさい。 NOT MATCH エッセンシャル NOT MATCH ################################################################# 問題点<$mail_honbun>の場合 マッチするカタカナと、しないカタカナがある事。(エッセンシャルがマッチして、ダメージがマッチしない事) 問題点<$body_sjis>の場合 。を超えるとマッチしない事。 マッチするカタカナと、しないカタカナがある事。(エッセンシャルがマッチして、ダメージがマッチしない事) 自分で何が問題なのか、何を知らないのかがはっきりしません。 文字コードSJISを使わない方がいいのでしょうか? 参考になる事や、調べたら解決しそうなキーワードがあれば教えて下さい。宜しくお願いします。 ファイル"php.ini"の設定 mbstring.language = Japanese mbstring.internal_encoding = SJIS mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = On mbstring.detect_order = SJIS,EUC-JP,JIS,UTF-8,ASCII

    • ベストアンサー
    • PHP
  • preg_matchの正規表現がうまくいかない

    たとえば、http://gehasoku.com/?p=2のソースコードには ------------------- <rdf:Description rdf:about="http://www.com/aaa.html" trackback:ping="http://www.com" dc:title="タイトル" dc:identifier="http://iii.com/bbb.html" dc:subject="ハードウェア" dc:description="1 名前:名無しさん " dc:creator="soft_net" dc:date="2012-02-21T20:05:01+09:00" /> ------------------- のような形の<rdf:Description~~~/>タグの情報ががいくつかあると思います。これらすべてを文字列として取得したくて、次のようなphpを作成しましたが、うまく動作しません。 原因はどうやらpreg_match_allの正規表現がうまくいっていないからのようですので、 <rdf:Description~~~/>を抜き出すことができる正規表現を教えてください。 自分でもここでチェックしながらやりましたが、 http://www.rider-n.sakura.ne.jp/regexp/regexp.php <rdf:Description~をマッチすることはできても、/>で閉じることができませんでした。 よろしくお願いします。 <?php $url="http://gehasoku.com/?p=2"; $html=file_get_contents($urls); preg_match_all("/<rdf:Description(.*)?\/>/",$html,$match); print_r($match); foreach($match[1] as $value){ echo $value; } ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう