• ベストアンサー

PHPで文字列の検索

今日はじめてPHPを触ったので、的外れな事を言っていたら指摘してください。 ある文字列に"テスト"という文字列が含まれていた場合処理1をしたいのですが、 リファレンスを読んでstrposを使うことまではわかりました。 そこで、以下のスクリプトを作成しました。 if(strpos($txtContents, "テスト") >= 0){ 処理1; }else { 処理2; } これだと、$txtContentsに「テスト」が含まれない場合、処理1に 流れてしまいます。 「テスト」が含まれるときも処理1に流れます。 どこが間違っているか教えてもらえますか? 宜しくお願いします。

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

  • ベストアンサー
  • bricks
  • ベストアンサー率69% (16/23)
回答No.4

出過ぎたマネをして申し訳ありません。 misschoiceさんには失礼かなと思いましたが やはり修正しておいた方が良いと思い 投稿させていただきましたm(__)m PHPはまだ文法が流動的な言語なので 新しい表記法がどんどん追加されてます。 困ったものです。 boolean型と他の型は PHP4では明確に区別されています。 PHPではif等の制御構文は 条件判定をboolean型として行いますので 他の型は強制的にキャストされます。 ですので「0」はboolean型である 「FALSE」に変換されてしまうのです。 多くの関数はエラーや値が取得出来なかった場合 「FALSE」を返すようになっています。 大抵の関数は普通に判定して問題無いのですが 検索関数等の 値として「0」や「""」が返ってくる可能性があるものは この表記法は結構出てくると思います。 PHPのマニュアルへのURLを記しておきます。 ざっと目を通しておくと良いでしょう。

参考URL:
http://php.netmonic.com/manual/ja/function.strpos.php
chachako
質問者

お礼

再度の回答ありがとうございます。 今回のはなんとかできそうなのですが、 0や""が返ってくる場合にfalseの0に変換されてしまうと、 たとえば返値が=0だった場合、という処理の場合、どう記述すればいいのでしょうか。 もしおわかりでしたら教えていただけると嬉しいです。 マニュアルも読んでいるのですが、小さい事につまづくことが多いです~(T_T)

chachako
質問者

補足

すみません、マニュアルに書いてありましたね・・(;^_^A アセアセ・・・ 解決です。どうもありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.3

不完全な回答ですいませんでした。 brickさん、修正回答ありがとうございました。 少し調べてみました。 比較演算子「===」や「!==」はbricksさんのおっしゃるとおり型を考慮した演算子で PHP4から追加されたもののようです。 処理1と処理2の順を変えたくない場合、「!==」を使用するといいのではないでしょうか。 true、falseはブール型ですがそれぞれ実体は1,0と等価だと思います。 (C言語などの表意定数と同じ値にしたのだと思います) strposの返り値は通常(?)int型ですが、 インデックス0で見つかったとき→int型の0 見つからなかったとき→bool型の0(すなわちfalse) を返すということだと思います。 そのまま単純に「0」で判定すると両方とも引っ掛かってしまうのでしょう。 関数の戻りの型が変わるというパターンは私は初めてで、 うまく説明できてないかもしれません。

chachako
質問者

お礼

わざわざ調べていただきどうもありがとうございます。 なるほど、0が含まれてしまうのはfalseの0が返っていたからなんですね。 とすると、phpの関数は、だいたいこういった使い方をするのでしょうか。 みなさんどうやってプログラミングしているのか不思議です。 今日はじめてphpを触ったので、まだわからないことだらけですので、 自分でも色々と調べてみますね。 もう少し、情報がいただけるかもしれないのでしばらく締め切らないでおきます。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • bricks
  • ベストアンサー率69% (16/23)
回答No.2

#1の方の修正です。 型の一致条件も加えないと 「0」と「false」が同じとみなされてしまいますので if(strpos($txtContents, "テスト") === false){  処理2; }else {  処理1; } としておいた方が良いでしょう。

chachako
質問者

補足

ありがとうございます。 できました。 でも、なぜ>=ではだめなんでしょうか? >=0だと、falseの場合も含まれてしまいます。 そして、=== ←これってどういう意味なんでしょう? 逆もありかな?と思って>==0とやったらおこられました。 この順番でもできないことはないのですが、やはり処理1、処理2の 順に記述したいので、原因などわかりましたらまた教えてください。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

strposは使ったことがないので予想ですが... strpos関数は見つからなかったときに「false」を返すようです。 そこで、ちょっと書き換えて、 if(strpos($txtContents, "テスト") == false){  処理2; }else {  処理1; } としてみたらどうですか?

chachako
質問者

補足

ありがとうございます。 #NO2さんの回答とあわせてできました。 でも、なぜ>=ではだめなんでしょうか? >=0だと、falseの場合も含まれてしまいます。 この順番でもできないことはないのですが、やはり処理1、処理2の 順に記述したいので、原因などわかりましたらまた教えてください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字列を判断して処理をする書き方

    2バイトの文字列の中身によって違う処理をするプログラムを作成しています。 数値ならば、 switch(no){ case 10: 処理1 break; case 20 処理2 break; ・ ・ ・ } と書けるのですが、文字列だと if(strncmp(no,"10",2) == 0){ <処理1> }else if(strncmp(no,"20",2) == 0){ <処理2> }else if ・ ・ ・ } というような書き方しか分かりません。数値同様にswitch文できれいに書くような方法はありませんでしょうか? もしくはこうすればスマートに書けるというようなものがあればお教えください。よろしくお願いします。

  • 時刻を表す文字列からn分後の値を求めたい

    PHPを勉強している素人です。 タイトルが分かりにくくてすみません。 たとえば、「17:31:35」というような時刻を表す文字列があります。 これは17時31分35秒を表しているんですけれども、 この文字列からn分後の時刻を求めたいのですが、 単純に31+n と計算した場合、60以上になってしまう場合があります。 なにか上手な方法があれば教えてください。 そして、その値を元に 「17:31:35から5分以内の処理」とそうでない処理を if ~ elseで出来ればと思います。 どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • 文字列を点滅させたい

    JavaScriptを勉強しているのですが、文字を点滅させたいので下記の様なプログラム作成したのですがELSE文に絡む事ができません。 どうして動作しないのか?わからず投稿しました。 どうすればよいのでしょうか? 宜しくお願い致します。 <script language="JavaScript" type="text/javascript"> <!-- var flg=1; function test() { if (flg==1) { document.write("元気?"); flg=0; }else{ document.write(""); flg=1; } setTimeout("test()",2000); } // --> </script> <BODY onLoad="test()"></BODY>

  • PHPの文字列の比較について

    PHPの文字列の比較について質問です。 $hoge = "文字列¥¥テスト"; $foo = "文字列¥テスト"; とあった場合 var_dump($hoge == $foo); とすると trueがかえってきます。 バイト列としてみた場合 エスケープしたバックスラッシュと 構文上、エスケープの必要のないバックスラッシュの文字列上の 比較ですがこれが、なぜかtrueがかえってきます。 これは、当然の結果なのでしょうか? PHPは文字列を比較するさい、バイト列としての文字列のならびより アウトプットされる結果を比較しているということでしょうか? それとも、単純に上記変数$hogeと$fooはバスックスラッシュの使用方法は 関係なく同一のものとして扱われるのでしょうか?

    • 締切済み
    • PHP
  • PHPの文字列をJavascriptの変数にする

    PHPの変数に格納された文字列を、直接Javascriptの変数の一部として格納しようと考えています。 例:) <script> var txt = "<?php echo $text; ?>"; </script> しかし、$textにダブルクォーテーションなどの文字が含まれていると、スクリプト全体が破綻します。今のところ、PHPの中で、問題を起こしそうな文字列を変換するように処理しています。 例:) $text = str_replace("\\", "\\\\", $text); $text = str_replace("\"", "\\\"", $text); $text = str_replace("\n", "\\n", $text); これよりもスマートな方法(たとえば用意されている関数を使うなど)がありますでしょうか。

    • ベストアンサー
    • PHP
  • ファイル内の文字列を処理して、そのファイル内のphpスクリプトを実行

    いつも、お世話になります。 a.php 、b.phpについて a.phpで、 次のようにb.phpを読み込んで $filename = "b.php"; $array = file($filename); $html = join('', $array); そして、次のようにしてb.php内の文字列置換 $pattern="/xxxx/"; $replacement="yyyyy"; $html=preg_replace($pattern,$replacement,$html); そして、 print($html); とすれば、b.php内の文字列が置換された後で、html記載内容ががブラウザで表示されます。 ここで、 b.php内にphpスクリプトを記載した場合、そのphpスクリプトは実行されません。 a.phpで include_once($filename); とすれば、実行されます。しかし、b.php内の文字列を処理できません。 b.php内の文字列の処理と、b.php内のphpスクリプトの実行の両方を行う方法なんてないものでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 文字列の取得について

    配列には下記のような文字列が表示されています。 $array[$i]="text kldfjk kldof" このような長い文字列の場合にそこの ”text"とという文字列が表示されている場合には フラグを立てるというプログラムにしたいのですが、 このような処理ではうまくいきません。 何かよい解決策があれば教えていただけたらうれしいです。よろしくお願いいたします。 $single_1=strpos($array[$i],"text"); $flag=1;

    • ベストアンサー
    • PHP
  • PHPでクエリ文字列を利用する方法

    PHP初心者のKazukichiと申します。 PHPでクエリ文字列を利用する方法を教えて下さい。 具体的には、下記のように「リンクにクエリ文字列を埋め込む方法」を採りたいのですが、その場合のPHPスクリプトの記述方法についてご教示頂きたいのです。 <a href="kensaku.php?year=2005">2005</a> この場合、yearが変数となるようですが、この変数をPHPスクリプト(kensaku.php)で受け取るには、どのように記述すればよいのでしょうか。 よろしくお願い致します。

    • 締切済み
    • PHP
  • 検索に関する文字コード

    指定した文字列を元にデータベースよりデータを検索する プログラムを作成したんですが、下記のような不具合が 発生します。 1.例として"ABC DEF"というようにスペースが間に入っている文字列をURLの後に"http://www.aaa.com/test.php?test=ABC DEF"という風にして送ってやり、test.php側で $_GET["test"]として受け取った時に"ABC"となりスペースの前で区切られてしまいます。 2.HTML上のテキストボックスに"ABC CDF"という風に入力してtest.phpに送った場合、test.phpでは文字化けされた状態で受け取ってしまう。 3.特定はできませんが、日本語文字列でも文字化けするものとしないものがあります。 こういった現象から正しく検索処理が行えません。 ちなみに文字コードはすべてEUCで統一しています。 色々調べてはみたんですが、原因がよくわかりません。 解決策等ご存知でしたら教えていただけますよう 宜しくお願い致します。

    • 締切済み
    • PHP
  • コマンド 文字列検索 正規表現について

    すみませんどなたか教えて下さい。 ある処理が失敗するとエラーのlogファイルを出力します。 エラーがないと0バイトのファイルが作成されます。 そのファイルが0バイトの場合、次の処理を実行させるbatファイルを作成中です。 ファイルサイズの取得ができればいいのですが、コマンドで見つけ切れませんでした。 そこで、logファイルをfindftr /cで1文字でもあれば、、、で判断するようにしました。 正規表現を使って試しましたが、文字があってもヒットしません。 どなたかアドバイスをお願いします。 findstr /c:".*" d:\a.txt >nul 2>&1 if errorlevel 1 ( remエラーlogファイルに文字列なし ) else ( rem エラーlogファイルに文字列あり )