PHP Strings vergleichen (mit strcasecmp() )

M.E.

Lt. Commander
Registriert
Jan. 2007
Beiträge
1.923
Hallo zusammen,

Ich implementiere gerade eine Tagsuche mit PHP und habe Probleme damit Treffer richtig auszuwerten.
Ich vermute, dass es damit zusammenhängt, dass ich die Strings die ich vergleiche aus unterschiedlichen Quellen (txt-Datei und Übergabeparameter) erhalte, konnte den konkreten Grund aber leider noch nicht ausmachen.

PHP:
<?
# $search_keys ist Übergabeparameter aus der URL
$token = strtok($search_keys," ");

while($token)
{
   #... ein paar for-schleifen

   $tagarray = file(".../tags.txt"); #hier stehen die tags drinnen

  for($k=0; $k<sizeof($tagarray); $k++)
  {
     if (strcasecmp($token, $tagarray[$k]) == 0){										
     echo "Hab was gefunden!";
}
								
}
#...

}
?>
Laut Spezifikation von strcasecmp kommt 0 heraus, wenn zwei Strings gleich sind (Case-Insensitive).

Leider ist das bei mir aber nicht der Fall, was ich mit folgender Zeile, die ich in der for-Schleife ergänzt habe ausprobiert habe:
PHP:
echo $token." und ".$tagarray[$k]." =&gt; ".strcasecmp($token, $tagarray[$k])."<br>";

Ich erhalte folgende Ergebnisse:
Blau und Grau => -5
Blau und Blau => -2
Blau und Baum => 11
Blau und Vogel => -20
Blau und Vögel => -20
Blau und Sonne => -17
Blau und Draußen => -2
Blau und Ast => 1
Einfach statt == 0 auf == -2 umzusteigen geht nicht, da das ja auch bei "Blau und Draußen" herauskommt.

Woran kann das liegen?

Ich habe bereits versucht die TXT in verschiedenen Kodierungen abzuspeichern (UTF8 mit/ohne BOM, ANSI, ...), leider ohne Erfolg...

MfG
M.E.
 
Ist das Encoding das Selbe? strcasecmp( utf8_encode( 'äää' ), 'äää' ) ergibt -33.
 
Warum TXT, dafür sind Datenbanksysteme gedacht.
Wenn es aber sein muss:
Wie wärs mit strtoupper und strcmp
Code:
if(strcmp(strotoupper(a),strutoupper(b));
oder preg_match mit einer entsprechender Textdatei.
Code:
if(preg_match(preg_replace(" ","|",$textdatei),$query))

Sonst geb dir deine Werte mal mit bin2hex und damit im Binärformat aus. Dann sollte es auf jeden Fall ein Unterschied geben, wenn nicht => setlocale (Kommentare zu strcasecmp).
 
bu1137 schrieb:
Das (nicht entfernte) Zeilenende dürfte dein Problem sein.

So ist es.

Jede Zeile in dem resultierenden Array enthält das Zeilenende, außer es wird FILE_IGNORE_NEW_LINES verwendet; daher musst Du trim() verwenden, falls das Zeilenende nicht vorhanden sein soll.

Also am besten:

PHP:
foreach($tagarray as $tag) {
  $tag = rtrim($tag, "\r\n");

  if (strcasecmp($token, $tag) == 0) {								
    echo "Hab was gefunden!";
  }
}
 
Yuuri schrieb:
Ist das Encoding das Selbe? strcasecmp( utf8_encode( 'äää' ), 'äää' ) ergibt -33.

Dann wäre sein output höchst wahrscheinlich nicht "Blau und Blau" :)
 
Code:
Code:
<?php

$utf16le = iconv( 'utf-8', 'utf-16le', 'Blau' );
$utf16be = iconv( 'utf-8', 'utf-16be', 'Blau' );

echo strcasecmp( $utf16le, $utf16be ).'<br>';
echo $utf16le.' und '.$utf16be.'<br>';
Ausgabe:
Code:
98
Blau und Blau
Nicht alles was blau ist ist blau. ;)
 
Nun ja, worauf ich mich bezog:

Yuuri schrieb:
Ist das Encoding das Selbe?....

Das Encoding ist in deinem Beispiel auch das selbe. UTF16 bleibt UTF16, Endian hat nichts mit der Kodierung zu tun.
 
Zuletzt bearbeitet:
Zurück
Oben