Ошибка функции strpos в PHP, не находящая иглы - PullRequest
4 голосов
/ 17 сентября 2008

В 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' работает нормально.

Так почему же это не утверждение, получившее удар?

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 ]

7 голосов
/ 17 сентября 2008

используйте! == false вместо === true
Стрипос возвращает позицию в виде целого числа, если игла найдена. И это никогда не === бул.
Возможно, вас заинтересует PHP модуль токенизатора или пакет lexer в хранилище pear.

3 голосов
/ 17 сентября 2008

Согласно PHP документам , strpos () и stripos () будут возвращать целое число для позиции, ИЛИ логическое значение FALSE.

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

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

например. как у Javascript

String.indexOf(str)
3 голосов
/ 17 сентября 2008

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

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

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

$table_id = 'foo'; exec('/bin/rm -rf /');
2 голосов
/ 17 сентября 2008

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

<?php
  $foo = "bar";

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

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

0 голосов
/ 17 сентября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...