PHP中的strpos函数问题没有找到针

时间:2008-09-17 13:47:00

标签: php string

在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的出现(即使没有$ prepended)。我无法理解为什么它不起作用,因为下面的strpos语句寻找'require'工作正常。

那么,为什么这个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;
    }
}

5 个答案:

答案 0 :(得分:7)

使用!== false而不是=== true
如果找到针,stripos会将位置返回整数。这绝不是===布尔。
您可能也对梨的存储库中的PHP tokenizer modulelexer package感兴趣。

答案 1 :(得分:3)

我认为VolkerK已经有了答案 - stripos()不返回布尔值,它返回字符串中的位置,如果找不到则返回false - 所以你想要检查返回是不是假的使用!= =(不!=因为你想检查类型)。

此外,请小心使用该eval(),除非您知道可以信任您从$ fh读取的数据来源。

否则,该行上可能还有其他任何你无意中eval() - 该行可能是这样的:

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

答案 2 :(得分:3)

根据PHP docs,strpos()和stripos()将返回一个位置的整数, OR 一个布尔值为FALSE。

由于0(零)是一个有效且非常可预期的索引,因此应谨慎使用此函数。

大多数lib将此函数包装在一个更好的(或类)中,如果找不到该值,则返回-1。

e.g。喜欢Javascript的

String.indexOf(str)

答案 3 :(得分:2)

变量插值仅对“字符串”执行,而不是“字符串”(请注意引号)。即。

<?php
  $foo = "bar";

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

打印$ foobar。改变你的报价,一切都应该好。

答案 4 :(得分:-1)

为什么使用===参数?

如果它在行中的任何位置,它将是一个整数。您还要使用====

比较类型

根据我的理解,你会问它“如果位置相同且类型与真实相同”,这将永远无效。