PHP strpos演算子の意味が分からない

このQ&Aのポイント
  • PHPのstrpos演算子とは何か、その意味を教えてください。
  • strpos関数は、指定した文字列内で指定した文字列が最初に現れる位置を返すものです。
  • ===演算子を使用すると、strpos関数は文字列が一致するかどうかだけでなく、位置も一致するかどうかも確認します。
回答を見る
  • ベストアンサー

「404判定のstrpos」の演算子が分からないの

「404判定のstrpos」の演算子の意味が分からないので、教えてください。 ▽404 Not Found時の対処 | PHPのQ&A【OKWave】   http://okwave.jp/qa/q4783971.html に掲載されていた下記を試したら、期待した動作になったのですが、 if (strpos($hdr[0],'404')!==false){  echo 'Not Found'; } else { しかし、 ▽PHP: strpos - Manual   http://php.net/manual/ja/function.strpos.php を参考に、「===演算子」へ変更したら、 if (strpos($hdr[0],'404')===false){  echo 'Not Found'; } else { 正常なURL(200)も、全てNot Foundになってしまいます。 ちなみに、 if (strpos($hdr[0],'404')==true){ だったら、期待通りの動作になりますが、 if (strpos($hdr[0],'404')===true){ だと、何が来ても同じ結果になります。 なんででしょうか? strpos関数の返り値を調べる際 ===演算子 を 利用しなくても良いのでしょうか?

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

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

=== の否定が !== です。 マニュアルの「この関数の返り値を調べるには ===演算子 を 使用してください。」とは (1)『FALSEである(見つからなかった)』という判定には===を使う (2)『FALSEでない(見つかって、その位置が数値で返ってきた)』という判定には!==を使う ということです。(2)のケースまで === を使え、という意味ではありません。 # 結果を否定して (!(strpos($hdr[0],'404')===false)) としたり、 # thenとelseの内容を入れ替えて #if (strpos($hdr[0],'404')===false){ # ... #} else { # echo 'Not Found'; #} # としたりもできますが。 > strpos($hdr[0],'404')===false 「404が見つからなかったら」の意味になるので、意味が反転します。 200等、404以外の全てが「echo 'Not Found';」になります。 それが「書いた通りの正しい動作」です。「期待した動作」ではないでしょうが。 > strpos($hdr[0],'404')==true > だったら、期待通りの動作になります たまたまです。 http://www.php.net/manual/ja/types.comparisons.php にあるように、 404が先頭で無いので、 404だった場合: 0でない数値 == TRUE → TRUE 404でなかった場合: FALSE == TRUE → FALSE になり、正常に見えるだけです。404が先頭から始まっていたら 404だった場合: 0 == TRUE → FALSE 404でなかった場合: FALSE == TRUE → FALSE と、「期待通り」には動作しません。 > if (strpos($hdr[0],'404')===true){ > だと、何が来ても同じ結果になります。 strposはTRUEを返さないので、===trueは常に成立しません。「書いた通りの正しい動作」です。

re999
質問者

お礼

回答ありがとうございました。 >=== の否定が !== 初めて知りました >マニュアルの「この関数の返り値を調べるには ===演算子 を 使用してください。」とは >(1)『FALSEである(見つからなかった)』という判定には===を使う >(2)『FALSEでない(見つかって、その位置が数値で返ってきた)』という判定には!==を使う >ということです。(2)のケースまで === を使え、という意味ではありません なるほど…。読み違えて、全く気がつきませんでした >「404が見つからなかったら」の意味になるので、意味が反転します。 >200等、404以外の全てが「echo 'Not Found';」になります 当初、404も「echo 'Not Found';」になると思っていたのですが、勘違いでした。 改めて試したら、ご指摘通りの動作になりました >> strpos($hdr[0],'404')==true >> だったら、期待通りの動作になります >たまたまです。 ここの説明も詳しくて大変参考になりました >strposはTRUEを返さないので、===trueは常に成立しません。「書いた通りの正しい動作」です 全ての疑問に丁寧に解説いただいたので、助かりました。 また、深夜(もしくは早朝)でのご対応、ありがとうございましたー

関連するQ&A

  • phpの論理演算子につきまして

    はじめまして PHP初心者でございます。 複数の値と一つでも一致したら true を返したいのですが、、、 $sample の値が 01 または 02 ・・・・・30 のどれか一つと一致した場合 true とするばあい <?php if ($sample == 01 || 02 || 03 || 04 || ・・略・・|| 30) { echo "<p>条件に合っています。</p>"; } else { echo "<p>条件以外です。</p>"; } ?> このような演算子の表記でいいのでしょうか? 別にいい方法はございますでしょうか。 ご教授いただければ幸いです。

    • ベストアンサー
    • PHP
  • if文の中で否定演算子を使うことについて

    PHPの勉強をしています。 今、基礎的な内容の本とより実践的な内容の本、コードサンプルが満載の本の 計3冊で勉強しておるのですが、 たまたまなのかわかりませんが、この三冊の中ででてくるコードを見てみると、 if文の中に否定演算子、例えば IF(!A || !B) {   A、もしくはBがfalse だったのが反転してTrueになった場合の処理 }else {   A、Bどちらともtrueだったのが反転してfalseになった場合の処理 } といった条件文に否定演算子を含めたコードサンプルがほとんどです。 。。。。三冊ともこの調子なので もしかしてPHPのコーティング作法なのかな?と思いましたが ネットで検索してもそれらしい情報は見当たらず...... 自分が何がわからないのか それ自体よくわかってないのかもしれませんが IF文を使う際、条件に否定演算子を使うべきときってのがあるんだと思います。 となると、その時を判断する基準などがあるのでしょうか? 初心者なのでなにか重大な思い違いをしてるのではないかと思ってます。 なにか気づくことがあれば教えてください。

    • ベストアンサー
    • PHP
  • PHPでの変数の扱い方

    PHPで(1)、(2)共にtrueになります。 (1)、(2)についてどうしてこうなるのか簡単に解説してもらえませんか。 また(1)が正しく動作するようにするにはどう修正すればいいですか。 (1) $value=0; if($value == '-'){ print("true"); }else{ print("false"); } (2) $value='-'; if($value == 0){ print("true"); }else{ print("false"); }

    • ベストアンサー
    • PHP
  • 【PHP】UA判別によるCSSの振り分け

    PHPはドのつく初心者です。 現在PHPでCSSの振り分けに挑戦しています。 私が持っている機種はauガラケーとAndroidだけですので、iPhoneなどの挙動確認はFireFoxのUA変更アドオン「User Agent Switcher」で行っております。 auガラケー実機で以下のPHPは正しく振り分けられていたのですが、FireFoxのアドオンにてDoCoMoのUAでアクセスした場合に、ガラケーのCSSに加えてPC(その他)のCSSが読みこまれてしまいました。 <link rel="stylesheet" type="text/css" href="garak.css" media="all"> <link rel="stylesheet" type="text/css" href="design.css" media="all"> ↑このような感じです。 auのUAアクセスでも同様の症状が発生していますが、こちらはガラケー本体で動作確認できているので大丈夫だとは思います。もしかしたらちゃんと実機で読みこめば行けるのかな?と思いつつ、不安が残っております。 DoCoMo実機は家にないので確認の仕様がありません。 以下のPHPでDoCoMo機種の動作は正しくいくのでしょうか? <?php $ua = $_SERVER['HTTP_USER_AGENT']; if ((strpos($ua,'DoCoMo') !== false) || (strpos($ua,'KDDI') !== false) || (strpos($ua,'UP.Browser') !== false) || (strpos($ua,'J-PHONE') !== false) || (strpos($ua,'Vodafone') !== false) || (strpos($ua,'SoftBank') !== false) ) { echo '<link rel="stylesheet" type="text/css" href="garak.css" media="all">'; } if ((strpos($ua,'iPhone') !== false) || (strpos($ua,'iPod') !== false) || (strpos($ua,'Android') !== false) ) { echo '<link rel="stylesheet" type="text/css" href="smart.css" media="all">'; } else { echo '<link rel="stylesheet" type="text/css" href="design.css" media="all">'; } ?>

  • ifの判定ができません。

    $url = urldecode($_SERVER["REQUEST_URI"]); $japaneseorenglish = str_split($url); $counthensu = count($japaneseorenglish); $mbhensu = mb_strlen($url,'utf8'); if($counthensu == $mbhensu) { ifの処理 } else { elseの処理 } と記述しているのですが判定がすべてelseの処理となってしまいます。 ($counthensu=8 $mbhensu=8とechoでは表示されていても) ちなみに if (strpos($_SERVER['REQUEST_URI'], '/honyarara/') === 0) { とした場合は正常に動作します。 if($counthensu == intval($mbhensu)) { などとしてみましたがだめでした。 改善策などご教示いただけましたら幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 文字列比較の演算子

    Perl の世界から PHP にやってまいりました。 Perl では、文字列の比較には専用の演算子がありまして、 str1 eq str2 とすると、二つの文字列が同値かどうか調べられますが、PHP にはこのような演算子はないのでしょうか? www.php.net のマニュアルを見ても、そのような演算子がありません。 == 演算子が使えるものかと <?php $str1 = "this is string" ; $str2 = "this is string" if( $str1 == $str2 ) { echo "two string is same" ; } ?> などを試してみるとうまくいくようですが、www.php.net のマニュアルには「文字列を数値化して比較する」と書いてあり、本当に文字列比較が出来るか確信がもてず…。 結局、文字列を比較したいときには strcmp を呼び出していますが、これは PHP 的には正しいのでしょうか?

    • ベストアンサー
    • PHP
  • XAMPを使っているのですが、論理演算子がうまく機能しません。

    XAMPを使って、PHPプログラムの練習をしています。 論理演算子を試しているですが、本に書いてあるような結果に なりません。phpバージョンはPHP 5.3.0です。 $f = true; $g = false; $h = $f and $g; $i = $g and $f; echo "result:".$h; $hも$gも同じように結果は空白になるはずなのですが、$hのほうは 1が返ってきます。なにが原因なのでしょうか?よろしくお願いします。

    • ベストアンサー
    • PHP
  • vbsのif文で複数条件の判定

    例えば以下である場合、 WScript.echo AAA WScript.echo BBB vbsを実行すると "?"が表示されます。 "OK"が表示されない原因として考えられる事はありますでしょうか If AAA = false Then If BBB = false Then WScript.echo "OK" else WScript.echo "NG" End If else WScript.echo "?" End If

  • テーブルの項目内に「含まれる」かどうかの判定

    PHPでMySQLのデータベースを参照するSQL文を書いています。 room_equipment というテーブル内に area という項目があり、この中は 1,3,5,8 のように、複数の数字がコンマ区切りで入っています。 分からないなりに <?php if($room_equipment['area']==6){ echo '当たり'; } else { echo '外れ'; } ?> と書いてみたのですが、これだと、 area の項目内の先頭に6が来ているときは「当たり」と表示されるものの、 項目内が 1,3,5,6 というような内容のときには「はずれ」と表示されます。 たぶん、== というのは単純に「等しい」ことを差しており、 「含まれている」という意味ではないのではないかと思いました。 いろいろレクチャーサイトをのぞいてみましたが、 「項目に含まれている」ということを指し示す演算子は どのようなもので、上記のコードはどのように修正すれば良いでしょうか? どなたか、教えていただけますと大変助かります。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPの不等式に変数を使う

    いつもお世話になります PHPの不等式に変数を使うことは出来ますでしょうか? 例えば $a = 'huga'; $b = 'huga'; if($a == $b){ echo 'hoge'; } 結果 hoge 右辺と左辺の間、不等式を変数にしたいです $a = 'huga'; $b = 'huga'; $c = '==' if($a $c $b){ echo 'hoge'; } 期待する結果 hoge 上のソースはもちろんパースエラーとなり成り立ちません 型変換や考えられるキーワードで検索したのですが、出てきませんでした 下のように strpos()、strstr()等で$cの内容を解析して、条件分岐すれば期待の結果が出せるのは分かります if( strpos($c,'==') !== false && $a == $b){ echo 'hoge'; } (上記で成り立つのは分かります) 教えていただきたい内容は、「不等式を変数で成り立たせる方法」です $c= '=='; PHPに詳しい方お教えいただけると嬉しいです

    • ベストアンサー
    • PHP

専門家に質問してみよう