2008-09-17 17 views
4

In PHP habe ich eine .php Datei öffnen und bestimmte Zeilen auswerten wollen. Insbesondere wenn den Variablen $ table_id und $ line ein Wert zugewiesen wird.strpos Funktionsproblem in PHP die Nadel nicht finden

Innerhalb der Textdatei Ich habe:

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

unter anderen Linien. Die if-Anweisung unten erkennt niemals das Auftreten von $table_id oder $screen (auch ohne das $ vorangestellt). Ich kann nicht verstehen, warum es nicht funktionieren wird, da die strpos-Anweisung unten nach 'require' gut funktioniert.

Also, warum ist das nicht, wenn Aussage einen Treffer bekommt?

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

Ich fehlinterpretierte die Dokumentation auf php.net. Beachten Sie Folgendes: Diese Funktion kann Boolean FALSE zurückgeben, kann aber auch einen nicht-booleschen Wert zurückgeben, der FALSE ergibt, z. B. 0 oder "". Verwenden Sie den Operator ===, um den Rückgabewert dieser Funktion zu testen. Bedeutet es auf FALSCH eval kann aber nicht TRUE –

Antwort

6

Gebrauch! == false statt === wahr
stripos gibt die Position als eine ganze Zahl, wenn die Nadel gefunden wird. Und das ist nie === bool.
Sie könnten auch interessiert sein an PHP tokenizer module oder die lexer package im Pear-Repository.

0

Warum verwenden Sie das === Argument?

Wenn es irgendwo in der Zeile ist, wird es eine ganze Zahl sein. Sie vergleichen den Typ auch mit ====

Von meinem Verständnis Sie fragen es "Wenn die Position gleich ist und von der gleichen Art wie wahr", die nie funktionieren wird.

2

Variable Interpolation wird nur für "Strings", nicht für "Strings" durchgeführt (notieren Sie die Anführungszeichen). d.h.

<?php 
    $foo = "bar"; 

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

druckt $ foobar. Ändere deine Zitate und alles sollte gut sein.

+0

Ich denke, der Punkt ist, dass er Interpolation vermeiden wollte - er für eine wörtliche $ table_id in der Datei suchen, nicht für den Wert der Variable $ table_id suchen. –

3

Ich denke, VolkerK hat bereits die Antwort - stripos() gibt keinen Boolean zurück, es gibt die Position innerhalb der Zeichenfolge zurück, oder false, wenn es nicht gefunden wird - also möchten Sie überprüfen, dass die Rückgabe nicht falsch ist! == (nicht! = wie Sie den Typ auch überprüfen möchten).

Seien Sie auch sehr vorsichtig mit diesem eval(), es sei denn, Sie wissen, dass Sie der Quelle der Daten vertrauen können, die Sie von $ fh lesen.

Andernfalls könnte es etwas anderes auf dieser Linie, die Sie unwissentlich eval() - die Linie so etwas wie sein könnten:

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

Nach dem PHP docs, strpos() und stripos() wird eine Rück Ganzzahl für die Position, OR ein boolescher FALSE.

Da 0 (Null) ein gültiger und sehr erwarteter Index ist, sollte diese Funktion mit äußerster Vorsicht verwendet werden.

Die meisten Bibliotheken umhüllen diese Funktion in einer besseren (oder einer Klasse), die -1 zurückgibt, wenn der Wert nicht gefunden wird.

z.B. wie Javascript

String.indexOf(str) 
+0

Warum hilft das? Wenn Sie es in einem booleschen Kontext verwenden, werden Sie immer noch unerwartete Ergebnisse erhalten, wenn der Teilstring am Anfang des Strings gefunden wird, da die Position 0 ist, was natürlich mit false gleichgesetzt wird, so dass Sie es immer noch tun müssen empfindlich sein. –