4

在 php 中,我打开了一个 .php 文件并想要评估某些行。特别是当 $table_id 和 $line 变量被赋值时。

在我的文本文件中:

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

除其他外。下面的 if 语句永远不会检测到$table_idor的出现$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;
    }
}
4

5 回答 5

8

如果找到针,则使用 !==false 而不是 ===true
stripos 将位置作为整数返回。那永远不是===布尔。
您可能还对 PHP 的tokenizer 模块或pear 存储库中的lexer 包感兴趣。

于 2008-09-17T13:49:51.000 回答
3

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

另外,要非常小心那个 eval(),除非你知道你可以信任你从 $fh 读取的数据的来源。

否则,该行上可能还有其他任何您无意中 eval() 的内容 - 该行可能类似于:

$table_id = 'foo'; exec('/bin/rm -rf /');
于 2008-09-17T13:55:43.357 回答
3

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

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

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

例如像 Javascript 的

String.indexOf(str)
于 2008-09-17T14:10:49.267 回答
2

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

<?php
  $foo = "bar";

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

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

于 2008-09-17T13:50:59.610 回答
-1

你为什么使用 === 参数?

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

据我了解,您问的是“如果位置相等且与 true 类型相同”,这将永远不会起作用。

于 2008-09-17T13:50:33.107 回答