PHP中的strpos函数问题找不到针

时间:2020-03-05 18:58:55  来源:igfitidea点击:

在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的出现(即使没有$前缀)。我不明白为什么它不起作用,因为下面的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;
    }
}

解决方案

回答

使用!== false而不是=== true
如果找到了针,stripos将以整数形式返回位置。从来没有=== bool。
我们可能也会对PHP的tokenizer模块或者pear存储库中的lexer包感兴趣。

回答

为什么使用===参数?

如果它在行中的任何地方,它将是一个整数。我们还通过使用====比较类型

据我了解,我们要问的是"位置是否相等,并且类型是否与true相同",这将永远行不通。

回答

变量插值仅在"字符串"上执行,而不是在"字符串"上执行(请注意引号)。 IE。

<?php
  $foo = "bar";

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

打印$ foobar。更改报价,一切都会很好。

回答

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

另外,请务必谨慎使用该eval(),除非我们知道可以信任从$ fh读取的数据源。

否则,该行上可能还有其他内容,我们不经意间eval()该行可能类似于:

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

回答

根据PHP文档,strpos()和stripos()将返回该位置的整数或者布尔值FALSE。

由于0(零)是有效且非常可预期的索引,因此使用此函数时应格外小心。

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

例如像Javascript的

String.indexOf(str)