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)