2008-09-17 1 views
4

В php У меня есть файл .php и вы хотите оценить определенные строки. В частности, когда переменным $ table_id и $ line присваивается значение.проблема функции strpos в PHP, не находя иглу

В текстовом файле у меня есть:

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

среди других линий. В приведенном ниже описании if не обнаруживается наличие $table_id или $screen (даже без $ prepended). Я не могу понять, почему он не будет работать, поскольку инструкция strpos ниже ищет «требовать» работы отлично.

Итак, почему это не так, если заявление получило хит?

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; 
    } 
} 
+0

Я неверно истолковал документацию на php.net. Обратите внимание на следующее: Эта функция может возвращать Boolean FALSE, но может также возвращать небулево значение, которое оценивается как FALSE, например 0 или «". Используйте оператор === для проверки возвращаемого значения этой функции. Значит может Eval ЛОЖЬ, но не ИСТИНА – 2008-09-17 14:13:16

ответ

6

использование! == ложный вместо === истинных
stripos возвращает позицию как целое число, если игла находится. И это никогда не бывает = bool.
Вы также можете быть заинтересованы в PHP tokenizer module или lexer package в репозитории груши.

0

Почему вы используете === Аргумент?

Если это место в строке, оно будет целым. Вы сравниваете этот тип также с помощью ====

Из моего понимания вы спрашиваете его: «Если позиция равна и того же типа, что и истина», которая никогда не будет работать.

2

Переменная интерполяция выполняется только на «строках», а не на «строках» (обратите внимание на кавычки). т.е.

<?php 
    $foo = "bar"; 

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

принты $ foobar. Измените свои кавычки, и все должно быть хорошо.

+0

Я думаю, дело в том, что он хочет, чтобы избежать интерполяций - он ищет буквальные $ table_id в файле, не ищет значение $ table_id переменных в . – 2008-09-17 14:02:41

3

Я думаю, что у VolkerK уже есть ответ - stripos() не возвращает логическое значение, он возвращает позицию внутри строки, или false, если она не найдена - поэтому вы хотите проверить, что возврат не является ложным, используя! == (not! = как вы хотите проверить тип также).

Кроме того, будьте очень осторожны с этим eval(), если не знаете, что можете доверять источнику данных, которые вы читаете, от $ fh.

В противном случае, не может быть что-нибудь еще на той линии, которую вы невольно Eval() - линия может быть что-то вроде:

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

Согласно PHP docs, StrPos() и stripos() будет возвращать целое число для позиции, OR boolean FALSE.

Поскольку 0 (ноль) является допустимым и очень ожидаемым индексом, эту функцию следует использовать с особой осторожностью.

Большинство libs обертывают эту функцию в лучшую (или класс), которая возвращает -1, если значение не найдено.

например. как Javascript's

String.indexOf(str) 
+0

Почему это помогает? Если вы используете его в булевом контексте, вы все равно получите неожиданные результаты, если подстрока будет найдена в начале строки, так как позиция равна 0, что, конечно же, будет равно false, поэтому вы все равно быть разумным. – 2008-09-17 14:43:51