2008-09-17 3 views
4

PHP에서 .php 파일을 열고 특정 행을 평가하고 싶습니다. 특히 $ table_id와 $ line 변수에 값이 할당 된 경우. 텍스트 파일 내에서 PHP에서 strpos 함수 문제가 바늘을 찾지 못했습니다.

나는이 : 다른 라인 사이

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

. 아래의 if 문은 $table_id 또는 $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; 
    } 
} 
+0

나는 php.net에서 설명서를 잘못 해석했다. 다음에 유의하십시오. 이 함수는 부울 FALSE를 반환 할 수 있지만 0 또는 ""과 같이 FALSE로 평가되는 부울이 아닌 값을 반환 할 수도 있습니다. 이 함수의 반환 값을 테스트하려면 === 연산자를 사용하십시오. 그는 $에서 table_id 변수의 값을 찾고 있지, 파일에 문자 그대로 $에서 table_id을 찾고 - 는 –

답변

6

사용! == 대신 === 허위 사실
stripos는 정수로 위치를 반환합니다. 그리고 그것은 결코 bool이 아닙니다.
배 저장소의 PHP tokenizer module 또는 lexer package에 관심이있을 수 있습니다.

0

왜 === Argument를 사용하고 있습니까?

줄의 아무 곳이나 있으면 정수가됩니다. 당신은 또한 타입을 ====

을 사용하여 비교하고 있습니다. 제 생각에 당신은 "위치가 동등하고 똑같은 타입의 것이면 결코 작동하지 않을 것입니다."라고 묻습니다.

2

변수 보간은 '문자열'이 아니라 '문자열'에서만 수행됩니다 (따옴표에 유의하십시오). 즉

<?php 
    $foo = "bar"; 

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

print $ foobar입니다. 따옴표를 바꾸면 모두 잘되어야합니다.

+0

TRUE FALSE하지만 나는 점은 그가 보간을 피하기 위해 싶다고 생각에 평가 후면 수 있다는 것을 의미합니다. –

3

나는 VolkerK가 이미 답변을 가지고 있다고 생각합니다. - stripos()는 부울을 반환하지 않으며, 문자열 내의 위치를 ​​반환하거나, 발견되지 않으면 false를 반환합니다. 따라서 반환 값이 false가 아닌지 확인하고 싶습니다! == (not! = 당신이 타입을 검사하기를 원하는 것처럼.)

또한, $ fh에서 읽는 데이터의 출처를 신뢰할 수 없다는 사실을 알고 있으면 해당 eval()에 매우주의해야합니다.

그렇지 않으면, 당신은() 무의식적으로 평가 그 라인에 다른 어떤이있을 수 있습니다 - 라인은 같은 수 다음 PHP docs, strpos()와 stripos (에 따르면

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

)의 반환됩니다 위치의 정수는 또는은 부울 FALSE입니다.

0 (영)이 유효하고 매우 기대 가능한 색인이기 때문에이 함수는 매우 신중하게 사용해야합니다.

대부분의 libs는 값을 찾지 못하면 -1을 반환하는 더 나은 클래스 (또는 클래스)에서이 함수를 래핑합니다.

like javacript 's

String.indexOf(str) 
+0

그게 왜 도움이됩니까? 부울 컨텍스트에서이 문자열을 사용하는 경우 문자열의 시작 부분에 하위 문자열이있는 경우 예상치 못한 결과가 발생합니다. 위치는 0이므로 물론 false와 같으므로 여전히 도달해야합니다. 현명한 사람. –

관련 문제