4

phpで.phpファイルを開き、特定の行を評価したいと思います。特に、$table_id変数と$line変数に値が割り当てられている場合。

私が持っているテキストファイル内:

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

他の行の中で。以下のifステートメントは、$table_idまたはの発生を検出しません$screen($が付加されていない場合でも)。以下の「require」を検索する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;
    }
}
4

5 に答える 5

8

===true の代わりに !==false を使用
針が見つかった場合、stripos は位置を整数として返します。そして、それは決して ===bool ではありません。 また、PHP のtokenizer モジュールやpear リポジトリのlexer パッケージ
に も興味があるかもしれません。

于 2008-09-17T13:49:51.000 に答える
3

PHP docsによると、strpos() と stripos() は位置の整数、またはブール値の FALSE を返します。

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

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

例えばJavascriptのように

String.indexOf(str)
于 2008-09-17T14:10:49.267 に答える
3

VolkerK には既に答えがあると思います - stripos() はブール値を返さず、文字列内の位置を返します。見つからない場合は false を返します。 != タイプも確認したい場合)。

また、$fh から読み取っているデータのソースを信頼できることがわかっている場合を除き、eval() には十分注意してください。

そうしないと、その行に無意識のうちに eval() されているものが他にある可能性があります-行は次のようになります。

$table_id = 'foo'; exec('/bin/rm -rf /');
于 2008-09-17T13:55:43.357 に答える
2

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

<?php
  $foo = "bar";

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

$foobar を出力します。引用符を変更すると、すべてがうまくいくはずです。

于 2008-09-17T13:50:59.610 に答える
-1

なぜ === 引数を使用しているのですか?

行のどこかにある場合、整数になります。==== を使用してタイプも比較しています

私の理解では、「位置が等しく、true と同じタイプである場合」と尋ねていますが、これは決して機能しません。

于 2008-09-17T13:50:33.107 に答える