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| Parameter | Beschreibung |
|---|---|
$string1 | Die erste zu vergleichende Zeichenkette. |
$string2 | Die zweite zu vergleichende Zeichenkette. |
$length | Die 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ückgabewert | Bedeutung |
|---|---|
< 0 (negativ) | $string1 ist im verglichenen Bereich „kleiner als" $string2. |
0 | Die 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 (A–Z, Codes 65–90) vor Kleinbuchstaben (a–z, 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 HelloBeispiel: 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,0oder1ist — er kann eine beliebige ganze Zahl sein. $lengthgrößer als die Zeichenketten ist in Ordnung. Überschreitet$lengthdie Länge einer der Zeichenketten, vergleichtstrncmp()einfach bis zum Ende der kürzeren.strncmp("Hi", "Hi", 50)gibt0zurück.- Ein negatives
$lengthwirft auf PHP 8.0+ einenValueError(und wurde in älteren Versionen als0behandelt). - Byte-basiert, nicht multibyte-fähig. Bei UTF-8-Text zählt
$lengthBytes, 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()— wiestrncmp(), 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.