Start · Sprachen · PHP · Referenz · strncasecmp

strncasecmp

Funktion

Vergleicht die ersten <code>n</code> Zeichen zweier Zeichenketten binärsicher ohne Berücksichtigung der Groß-/Kleinschreibung.

seit PHP 4.0.2 Kategorie: string

Signatur

strncasecmp(string $string1, string $string2, int $length): int

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

Typ
int
Beschreibung
Gibt einen Wert kleiner als 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
Gleich Gleich 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
bool(true) bool(false) bool(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);
Array ( [0] => CHANGELOG.md [1] => README.md [2] => readme.txt [3] => readme_old.txt )

// 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.