W3docs

strncmp()

Die Funktion strncmp() in PHP vergleicht die ersten N Zeichen zweier Zeichenketten auf binär-sichere, case-sensitive Weise.

Einführung

Die Funktion strncmp() in PHP führt einen binär-sicheren, case-sensitiven Vergleich der ersten N Zeichen zweier Zeichenketten durch. Anstatt die Zeichenketten vollständig zu vergleichen, betrachtet sie nur den von Ihnen angegebenen führenden Abschnitt — was sie zum richtigen Werkzeug macht, wenn es um ein Präfix und nicht um den gesamten Wert geht (zum Beispiel, wenn Sie prüfen möchten, ob eine URL mit https beginnt, oder Codes gruppieren, die einen gemeinsamen Header teilen).

Dieser Artikel behandelt die Syntax von strncmp(), wie der Rückgabewert zu interpretieren ist, mehrere praktische Beispiele sowie häufige Stolperfallen.

Syntax

strncmp(string $string1, string $string2, int $length): int
ParameterBeschreibung
$string1Die erste zu vergleichende Zeichenkette.
$string2Die zweite zu vergleichende Zeichenkette.
$lengthDie maximale Anzahl an Zeichen, die vom Anfang jeder Zeichenkette verglichen werden.

strncmp() vergleicht die ersten $length Zeichen von $string1 und $string2 Byte für Byte und gibt eine ganze Zahl zurück:

RückgabewertBedeutung
< 0 (negativ)$string1 ist im verglichenen Bereich „kleiner als" $string2.
0Die ersten $length Zeichen sind gleich.
> 0 (positiv)$string1 ist im verglichenen Bereich „größer als" $string2.

Der Vergleich erfolgt lexikografisch auf Basis des Byte-Werts jedes Zeichens. Da ASCII-Großbuchstaben (AZ, Codes 65–90) vor Kleinbuchstaben (az, Codes 97–122) kommen, gilt "Apple" als kleiner als "apple". Die genaue Zahl ungleich null ist die Byte-Wert-Differenz des ersten abweichenden Zeichens, aber Sie sollten sich nur auf das Vorzeichen verlassen, nicht auf den Betrag.

Beispiel: Vergleich eines Präfixes

<?php

$string1 = "Hello World";
$string2 = "Hello";
$length = 5;

$result = strncmp($string1, $string2, $length);

if ($result < 0) {
  echo "The first $length characters of $string1 are less than the first $length characters of $string2";
} elseif ($result > 0) {
  echo "The first $length characters of $string1 are greater than the first $length characters of $string2";
} else {
  echo "The first $length characters of $string1 are equal to the first $length characters of $string2";
}

Obwohl sich "Hello World" und "Hello" insgesamt unterscheiden, sind ihre ersten 5 Zeichen ("Hello") identisch, sodass strncmp() 0 zurückgibt und die Ausgabe lautet:

The first 5 characters of Hello World are equal to the first 5 characters of Hello

Beispiel: Prüfen, ob eine Zeichenkette mit einem Präfix beginnt

Eine klassische Verwendung von strncmp() ist das Testen auf ein Präfix. Indem Sie die Länge des Präfixes als $length übergeben, vergleichen Sie nur so viel der Zeichenkette, wie das Präfix abdeckt:

<?php

$url = "https://www.w3docs.com";

if (strncmp($url, "https", 5) === 0) {
  echo "Secure URL";
} else {
  echo "Not secure";
}

Dies gibt Secure URL aus. Ab PHP 8.0+ drückt die dedizierte Funktion str_starts_with() dieselbe Absicht klarer aus, aber strncmp() bleibt die portable Wahl für ältere Versionen.

Beispiel: Case-Sensitiv

strncmp() unterscheidet Groß- von Kleinbuchstaben:

<?php

echo strncmp("PHP", "php", 3); // negative: 'P' (80) < 'p' (112)

Wenn Sie die Groß-/Kleinschreibung ignorieren möchten, verwenden Sie stattdessen strncasecmp(), das denselben längenbegrenzten Vergleich ohne Unterscheidung der Groß-/Kleinschreibung durchführt.

Häufige Stolperfallen

  • Nur das Vorzeichen ist aussagekräftig. Behandeln Sie das Ergebnis als „negativ / null / positiv" und bevorzugen Sie === 0, wenn Sie meinen „die Präfixe stimmen überein". Gehen Sie nicht davon aus, dass der Wert genau -1, 0 oder 1 ist — er kann eine beliebige ganze Zahl sein.
  • $length größer als die Zeichenketten ist in Ordnung. Überschreitet $length die Länge einer der Zeichenketten, vergleicht strncmp() einfach bis zum Ende der kürzeren. strncmp("Hi", "Hi", 50) gibt 0 zurück.
  • Ein negatives $length wirft auf PHP 8.0+ einen ValueError (und wurde in älteren Versionen als 0 behandelt).
  • Byte-basiert, nicht multibyte-fähig. Bei UTF-8-Text zählt $length Bytes, nicht Zeichen, sodass ein mehrbyte-Zeichen geteilt werden kann. Reine ASCII-Daten sind davon nicht betroffen.

Verwandte Funktionen

  • strcmp() — vergleicht zwei vollständige Zeichenketten, case-sensitiv.
  • strncasecmp() — wie strncmp(), aber case-insensitiv.
  • strcasecmp() — case-insensitiver Vergleich vollständiger Zeichenketten.
  • substr_compare() — vergleicht Zeichenketten ab einem gewählten Offset.
  • strpos() — findet die Position eines Teilstrings.

Fazit

strncmp() vergleicht nur die ersten N Zeichen zweier Zeichenketten, case-sensitiv und binär-sicher, und gibt eine negative Zahl, 0 oder eine positive Zahl zurück. Greifen Sie darauf zurück, wenn Sie ein Präfix abgleichen oder einen führenden Abschnitt fester Länge zweier Zeichenketten vergleichen möchten — und denken Sie daran, das Vorzeichen des Ergebnisses mit === 0, < 0 oder > 0 zu prüfen statt einen genauen Wert zu erwarten.

Übungen

Übung
Was ist die Funktion von strncmp() in PHP?
Was ist die Funktion von strncmp() in PHP?
Was this page helpful?