If-Anweisung funktioniert nicht mehr?!

Hallo Gemeinde,

habe hier mal wieder ein Problem:

Das folgende Script teilt den Satz ($i) in zwei Teile: In die Zahlen ($numbers) und den Text ($text). Danach wird in einer if-Anweisung geschaut, ob $text gleich „kilometer“ ist, wenn ja, gibt er den dazugehörigen Text aus und verarbeitet $numbers in diesem Text. Wenn $text aber gleich „meilen“ ist, soll er den dazu gehörigen Text ausgeben und $numbers da verarbeiten.

Hier das Script:


$i = „12 meilen“;
$numbers = preg_replace(’=([^0-9 ^.]+)=s’, ‚‘, $i); // Hier „12“
$text = preg_replace(’=([^a-z ^A-Z]+)=s’, ‚‘, $i); // Hier „meilen“

if ($text == meilen OR $text == meile)
{
echo $numbers*1.609;
echo " Kilometer";
}

if ($text == kilometer)
{
echo $numbers/1.609;
echo " Meilen";
}

Nur irgendwie verarbeitet er:
(1) $numbers im Text nicht (nimmt immer 0, obwohl es hier 12 ist)
(2) Funktioniert es generell nur, wenn $i nur Text ist, wenn ich aber die Zeile „if ($text == meilen)“ auf „if ($text = meilen)“ umändere, funktionierts, da wird dann auch $numbers verarbeitet, aber er zeigt mir sowohl den Meilen-Text als auch den Kilometer-Text, und das ist nicht Sinn der Sache.

Hoffe ihr könnt helfen.

Hallo

$text = preg_replace(’=([^a-z ^A-Z]+)=s’, ‚‘, $i);

Wenn man anschließend mal ein

echo $text;

hinschreibt, sieht man, dass $text mit einem Leerzeichen beginnt. Und das hat folgenden Grund:
Dass ^-Zeichen nach der öffnenden eckigen Klammer verneint alles bis zur schließenden eckigen Klammer. Obige Anweisung bedeutet also: Entferne alles, was kein Kleinbuchstabe, kein Leerzeichen, kein ^-Zeichen und kein Großbuchstabe ist.
Richtig muss es also heißen:

 $text = preg\_replace('=([^a-zA-Z]+)=s', '', $i);

Noch simpler wäre

 $text = preg\_replace('=([^A-z]+)=s', '', $i);

Für $numbers gilt das gleiche, nur wird hier das Leerzeichen von PHP ignoriert.

if ($text == meilen OR $text == meile)
if ($text == kilometer)

Hier fehlen einige Anführungszeichen. Die denkt sich PHP zwar dazu, aber besser man schreibt sie hin.

wenn ich aber die Zeile „if ($text == meilen)“ auf
„if ($text =meilen)“ umändere, funktionierts

Das ist klar. Mit einem Gleichheitszeichen ist es kein Vergleich, sondern eine Zuweisung. Und eine Zuweisung gibt den zugewiesenen Wert zurück, also in diesem Fall ‚meilen‘. Das wird aber als TRUE ausgewertet. Es wird grundsätzlich alles als TRUE ausgewertet, was nicht
* boolean FALSE selbst
* integer 0 (zero)
* float 0.0 (zero)
* Der leere string, und der string „0“
* Ein array ohne Elemente
* Ein object ohne Eigenschaftsvariablen (nur PHP 4)
* Der spezielle Typ NULL (inklusive nicht gesetzter Variablen)
* SimpleXML Objekte die aus leeren Tags erzeugt wurden.
ist.

Gruß Johannes

Hallo,

danke für deine gut erklärte Antwort. Habe es geändert und es funktioniert.