- ベストアンサー
PHPで文字列の検索
今日はじめてPHPを触ったので、的外れな事を言っていたら指摘してください。 ある文字列に"テスト"という文字列が含まれていた場合処理1をしたいのですが、 リファレンスを読んでstrposを使うことまではわかりました。 そこで、以下のスクリプトを作成しました。 if(strpos($txtContents, "テスト") >= 0){ 処理1; }else { 処理2; } これだと、$txtContentsに「テスト」が含まれない場合、処理1に 流れてしまいます。 「テスト」が含まれるときも処理1に流れます。 どこが間違っているか教えてもらえますか? 宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
出過ぎたマネをして申し訳ありません。 misschoiceさんには失礼かなと思いましたが やはり修正しておいた方が良いと思い 投稿させていただきましたm(__)m PHPはまだ文法が流動的な言語なので 新しい表記法がどんどん追加されてます。 困ったものです。 boolean型と他の型は PHP4では明確に区別されています。 PHPではif等の制御構文は 条件判定をboolean型として行いますので 他の型は強制的にキャストされます。 ですので「0」はboolean型である 「FALSE」に変換されてしまうのです。 多くの関数はエラーや値が取得出来なかった場合 「FALSE」を返すようになっています。 大抵の関数は普通に判定して問題無いのですが 検索関数等の 値として「0」や「""」が返ってくる可能性があるものは この表記法は結構出てくると思います。 PHPのマニュアルへのURLを記しておきます。 ざっと目を通しておくと良いでしょう。
その他の回答 (3)
- misschoice
- ベストアンサー率50% (14/28)
不完全な回答ですいませんでした。 brickさん、修正回答ありがとうございました。 少し調べてみました。 比較演算子「===」や「!==」はbricksさんのおっしゃるとおり型を考慮した演算子で PHP4から追加されたもののようです。 処理1と処理2の順を変えたくない場合、「!==」を使用するといいのではないでしょうか。 true、falseはブール型ですがそれぞれ実体は1,0と等価だと思います。 (C言語などの表意定数と同じ値にしたのだと思います) strposの返り値は通常(?)int型ですが、 インデックス0で見つかったとき→int型の0 見つからなかったとき→bool型の0(すなわちfalse) を返すということだと思います。 そのまま単純に「0」で判定すると両方とも引っ掛かってしまうのでしょう。 関数の戻りの型が変わるというパターンは私は初めてで、 うまく説明できてないかもしれません。
お礼
わざわざ調べていただきどうもありがとうございます。 なるほど、0が含まれてしまうのはfalseの0が返っていたからなんですね。 とすると、phpの関数は、だいたいこういった使い方をするのでしょうか。 みなさんどうやってプログラミングしているのか不思議です。 今日はじめてphpを触ったので、まだわからないことだらけですので、 自分でも色々と調べてみますね。 もう少し、情報がいただけるかもしれないのでしばらく締め切らないでおきます。 どうもありがとうございました。
- bricks
- ベストアンサー率69% (16/23)
#1の方の修正です。 型の一致条件も加えないと 「0」と「false」が同じとみなされてしまいますので if(strpos($txtContents, "テスト") === false){ 処理2; }else { 処理1; } としておいた方が良いでしょう。
補足
ありがとうございます。 できました。 でも、なぜ>=ではだめなんでしょうか? >=0だと、falseの場合も含まれてしまいます。 そして、=== ←これってどういう意味なんでしょう? 逆もありかな?と思って>==0とやったらおこられました。 この順番でもできないことはないのですが、やはり処理1、処理2の 順に記述したいので、原因などわかりましたらまた教えてください。
- misschoice
- ベストアンサー率50% (14/28)
strposは使ったことがないので予想ですが... strpos関数は見つからなかったときに「false」を返すようです。 そこで、ちょっと書き換えて、 if(strpos($txtContents, "テスト") == false){ 処理2; }else { 処理1; } としてみたらどうですか?
補足
ありがとうございます。 #NO2さんの回答とあわせてできました。 でも、なぜ>=ではだめなんでしょうか? >=0だと、falseの場合も含まれてしまいます。 この順番でもできないことはないのですが、やはり処理1、処理2の 順に記述したいので、原因などわかりましたらまた教えてください。
お礼
再度の回答ありがとうございます。 今回のはなんとかできそうなのですが、 0や""が返ってくる場合にfalseの0に変換されてしまうと、 たとえば返値が=0だった場合、という処理の場合、どう記述すればいいのでしょうか。 もしおわかりでしたら教えていただけると嬉しいです。 マニュアルも読んでいるのですが、小さい事につまづくことが多いです~(T_T)
補足
すみません、マニュアルに書いてありましたね・・(;^_^A アセアセ・・・ 解決です。どうもありがとうございました!