PHP Strings vergleichen (mit strcasecmp() )

M.E.

Lt. Commander
Dabei seit
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.
 

Yuuri

Fleet Admiral
Dabei seit
Okt. 2010
Beiträge
12.632
Ist das Encoding das Selbe? strcasecmp( utf8_encode( 'äää' ), 'äää' ) ergibt -33.
 

Hancock

Captain
Dabei seit
Nov. 2007
Beiträge
3.375
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).
 

xii

Lt. Junior Grade
Dabei seit
Feb. 2008
Beiträge
265
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

Fleet Admiral
Dabei seit
Okt. 2010
Beiträge
12.632
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. ;)
 
Top