Signatur
Beschreibung
strncasecmp() vergleicht die ersten $length Zeichen zweier Zeichenketten lexikografisch, ohne dabei zwischen Groß- und Kleinbuchstaben zu unterscheiden. Die Funktion ist binärsicher, d. h. sie betrachtet die Bytes der Zeichenketten direkt, ohne eine sprachspezifische Sortierreihenfolge (Locale) zu berücksichtigen.
Der Rückgabewert ist analog zu strcmp(): kleiner als 0, wenn $string1 kleiner als $string2 ist, 0 bei Gleichheit und größer als 0, wenn $string1 größer als $string2 ist. Damit lässt sich die Funktion direkt in Sortierfunktionen wie usort() einsetzen.
Typische Einsatzszenarien sind der Vergleich von URL-Präfixen, Dateinamen-Erweiterungen oder Protokollkennungen, bei denen Groß-/Kleinschreibung keine Rolle spielen soll und nur ein bestimmter Anfangsteil der Zeichenkette relevant ist. Im Gegensatz zu substr_compare() beginnt der Vergleich immer am Anfang beider Zeichenketten.
Soll die gesamte Zeichenkette verglichen werden, empfiehlt sich stattdessen strcasecmp(). Für einen case-sensitiven Vergleich der ersten n Zeichen steht strncmp() zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $string1 Pflicht | string | Die erste zu vergleichende Zeichenkette. | |
| $string2 Pflicht | string | Die zweite zu vergleichende Zeichenkette. | |
| $length Pflicht | int | Anzahl der Zeichen, die verglichen werden sollen. Bei einem Wert kleiner als 0 wird seit PHP 8.0.0 ein ValueError ausgelöst; in älteren Versionen wurde 0 zurückgegeben. |
Rückgabewert
0 zurück, wenn $string1 kleiner als $string2 ist, 0 wenn beide gleich sind und einen Wert größer als 0, wenn $string1 größer als $string2 ist. Der Vergleich ist case-insensitiv und beschränkt sich auf die ersten $length Zeichen.Beispiele
Grundlegender Vergleich der ersten n Zeichen
<?php
$result1 = strncasecmp('Hello World', 'hello PHP', 5);
$result2 = strncasecmp('Hello World', 'HELLO World', 5);
$result3 = strncasecmp('Alpha', 'Beta', 5);
echo $result1 === 0 ? 'Gleich' : 'Unterschiedlich'; // Gleich
echo PHP_EOL;
echo $result2 === 0 ? 'Gleich' : 'Unterschiedlich'; // Gleich
echo PHP_EOL;
echo $result3 < 0 ? 'Alpha < Beta' : 'Alpha >= Beta'; // Alpha < Beta
URL-Präfix prüfen (case-insensitiv)
<?php
function startsWithCaseInsensitive(string $haystack, string $prefix): bool {
return strncasecmp($haystack, $prefix, strlen($prefix)) === 0;
}
$url1 = 'HTTPS://example.com';
$url2 = 'http://example.com';
$url3 = 'ftp://example.com';
var_dump(startsWithCaseInsensitive($url1, 'https://')); // true
var_dump(startsWithCaseInsensitive($url2, 'https://')); // false
var_dump(startsWithCaseInsensitive($url3, 'ftp://')); // true
Einsatz in usort() für case-insensitive Sortierung nach Präfix
<?php
$dateien = ['README.md', 'readme.txt', 'readme_old.txt', 'CHANGELOG.md'];
usort($dateien, fn($a, $b) => strncasecmp($a, $b, 6));
print_r($dateien);
// Wichtig · Fallstricke
Negativer $length-Wert: Seit PHP 8.0.0 wird bei einem negativen $length-Wert ein ValueError ausgelöst. In PHP 7.x und älter wurde in diesem Fall 0 zurückgegeben, was schwer zu findende Bugs verursachen konnte.
Locale-Unabhängigkeit: Da die Funktion binärsicher arbeitet, werden Zeichen außerhalb des ASCII-Bereichs (z. B. Umlaute) rein nach ihrem Byte-Wert verglichen. Für locale-sensitive Vergleiche sollte stattdessen strcoll() oder die Intl-Extension verwendet werden.
Multibyte-Zeichen: strncasecmp() ist nicht Multibyte-fähig. Bei UTF-8-Zeichenketten mit Nicht-ASCII-Zeichen kann die Angabe von $length in Zeichen von der tatsächlichen Byte-Länge abweichen. Für Multibyte-Strings sollte mb_strtolower() in Kombination mit strncmp() genutzt werden.