2008-09-17 6 views
4

PHPで私は.phpファイルを開き、特定の行を評価したいと思います。特に、$ table_id変数と$ line変数に値が割り当てられている場合PHPでstrpos関数の問題が針を見つけられない

私が持っているテキストファイル内:他の行の中で

... 
$table_id = 'crs_class';      // table name 
$screen = 'crs_class.detail.screen.inc'; // file identifying screen structure 
... 

。下記のifステートメントは、$table_idまたは$screenの出現を検出することはありません($プリペンドされていなくても)。私はなぜそれがうまく動作するために '必要な'を探してstrposステートメントとして動作しません理解できません。

なぜこのif文がヒットしないのですか?

while ($line=fgets($fh)) { 
    //echo "Evaluating... $line <br>"; 
    **if ((($pos = stripos($line, '$table_id')) === true) || (($pos = stripos($line, '$screen'))===true))** 
    { 
     // TODO: Not evaluating tableid and screen lines correctly fix. 
     // Set $table_id and $screen variables from task scripts 
     eval($line); 
    } 

    if (($pos=stripos($line, 'require')) === true) { 
     $controller = $line; 
    } 
} 
+0

私はphp.netのマニュアルを誤解しています。 次の点に注意してください。 この関数は、Boolean FALSEを返すことがありますが、0または ""などFALSEと評価されるブール値でない値も返します。この関数の戻り値をテストするには、===演算子を使用します。彼は $ table_idが変数の値を見ていない、ファイル内のリテラル $ table_idがを探している - は、それが –

答えて

6

使用!==ではなく===真
striposの偽の針が見つかった場合、整数としての位置を返します。それは決してブールではありません。
また、PHPのtokenizer moduleまたはナシのリポジトリのlexer packageに興味があります。

0

なぜ===引数を使用していますか?

行のどこにあれば、整数になります。あなたはタイプも====

を使用して比較している私の理解から、あなたは "位置が同じで、同じタイプのものであれば動作しません"と尋ねています。

2

可変補間は「文字列」ではなく「文字列」に対してのみ実行されます(引用符に注意してください)。すなわち

<?php 
    $foo = "bar"; 

    print '$foo'; 
    print "$foo"; 
?> 

print $ foobarです。あなたの見積もりを変更し、すべてがうまくいくはずです。

+0

TRUE FALSEではなく、私はポイントは彼が補間を避けたかったということだと思うためにevalできることを意味します。 –

3

私はVolkerKは既に答えを持っていると思います - stripos()はブール値を返しません。文字列内の位置を返します。見つからなければfalseを返します。 ==(そうではありません!=同様にタイプをチェックしたいです)。

また、$ fhから読み込んでいるデータのソースを信頼できることが分かっていない限り、そのeval()には十分注意してください。 -

そうでない場合は、)あなたは知らず知らずのうちにevalその行(上の何かがあるかもしれないラインのようなものが考えられます。PHP docsによると

 
$table_id = 'foo'; exec('/bin/rm -rf /'); 
3

、strpos()とstripos()が返されます位置の整数、またはブール値FALSE。

0(ゼロ)は有効で、期待できるインデックスなので、この関数は非常に注意して使用する必要があります。

ほとんどのライブラリは、値が見つからない場合は-1を返す、より良いもの(またはクラス)でこの関数をラップします。

Javascriptのように

String.indexOf(str) 
+0

なぜそれが助けになるのですか?ブール値のコンテキストで使用すると、部分文字列が文字列の先頭にある場合には予​​期しない結果が得られますが、位置は0であるため、もちろんfalseになります。賢明である。 –

関連する問題