W3docs

strspn()

Die PHP-Funktion strspn() gibt die Länge des Anfangssegments eines Strings zurück, das nur aus Zeichen einer definierten Maske besteht.

Einführung

Die Funktion strspn() in PHP gibt die Länge des Anfangssegments eines Strings zurück, das ausschließlich aus Zeichen besteht, die in einer gegebenen Maske (einer Menge erlaubter Zeichen) enthalten sind. Sobald sie auf ein Zeichen trifft, das nicht in der Maske vorkommt, hört sie auf zu zählen und gibt zurück, wie viele Zeichen bis zu diesem Punkt übereinstimmten.

Eine intuitive Denkweise: „Wie viele Zeichen am Anfang gehören zu diesem erlaubten Zeichensatz, bevor ich auf eines stoße, das nicht dazugehört?" Das macht strspn() praktisch für einfache Validierungen und das Parsen — zum Beispiel, um zu prüfen, wie viele führende Ziffern ein String hat, oder ob ein Wert nur aus erlaubten Zeichen besteht.

Diese Seite behandelt die Syntax der Funktion, jeden Parameter (einschließlich des oft missverstandenen $start und $length), mehrere ausführbare Beispiele, häufige Fallstricke und die Beziehung zu strcspn().

Syntax

strspn(string $string, string $characters, int $offset = 0, ?int $length = null): int
ParameterBeschreibung
$stringDer zu untersuchende Ausgangs-String.
$charactersDie Maske — die Menge der Zeichen, die im Anfangssegment erlaubt sind. Die Reihenfolge der Zeichen spielt keine Rolle.
$offsetOptional. Die Position in $string, ab der gezählt wird. Ein negativer Wert zählt vom Ende des Strings. Standardwert: 0.
$lengthOptional. Die maximale Anzahl der zu prüfenden Zeichen. Ein negativer Wert endet so viele Zeichen vor dem Ende. Standardmäßig wird der Rest des Strings verwendet.

Rückgabewert: ein int — die Länge des übereinstimmenden Anfangssegments. Ist das allererste geprüfte Zeichen nicht in der Maske, wird 0 zurückgegeben.

Hinweis: Im offiziellen Handbuch heißen die Parameter $string und $characters. Man findet sie auch als subject und mask bezeichnet — sie bedeuten dasselbe.

Funktionsweise

Die Funktion durchsucht $string von links nach rechts (beginnend bei $offset) und führt einen laufenden Zähler, solange jedes Zeichen in $characters vorhanden ist. Der Scan hält beim ersten Zeichen an, das nicht in der Maske enthalten ist, und dieser Zähler wird zurückgegeben. Selbst wenn spätere Zeichen wieder übereinstimmen würden, schaut die Funktion nach der ersten Nichtübereinstimmung nicht mehr weiter.

strspn() ist case-sensitive und bytebasiert (arbeitet mit einzelnen Bytes, ist also nicht Multibyte/UTF‑8-fähig).

Einfaches Beispiel

php— editable, runs on the server

"Hello" (5 Zeichen) besteht ausschließlich aus Buchstaben der Maske "HeloWrd". Das nächste Zeichen ist ein Leerzeichen, das nicht in der Maske vorkommt, also stoppt der Scan und die Funktion gibt 5 zurück. Die Maske muss die erlaubten Buchstaben nur enthaltenW, r und d sind zwar vorhanden, der Scan erreicht sie jedoch nie.

Führende Zeichen zählen

Ein häufiger Anwendungsfall ist das Messen, wie viele führende Zeichen einer bestimmten Art ein String enthält — zum Beispiel führende Ziffern:

<?php

$digits = "1234567890";

echo strspn("42 is the answer", $digits); // 2
echo "\n";
echo strspn("abc123", $digits);           // 0 — first char 'a' is not a digit

Da "42 is the answer" mit zwei Ziffern beginnt, gefolgt von einem Leerzeichen, ist das Ergebnis 2. Im zweiten String ist das allererste Zeichen ein Buchstabe, weshalb die Funktion sofort 0 zurückgibt.

Verwendung von $offset und $length

Das optionale $offset ermöglicht es, den Zählbeginn mitten im String festzulegen, und $length begrenzt die Anzahl der geprüften Zeichen.

<?php

// Start at index 1 ("oobar"): 'o','o' match, 'b' stops -> 2
echo strspn("foobar", "of", 1);    // 2
echo "\n";

// Only examine the first 1 character: 'f' matches -> 1
echo strspn("foobar", "f", 0, 1);  // 1

Ein negativer $offset zählt vom Ende des Strings, und ein negatives $length hört so viele Zeichen vor dem Ende auf — nützlich, wenn ein abschließender Teil ignoriert werden soll.

Fallstrick: Groß-/Kleinschreibung

strspn() unterscheidet zwischen Groß- und Kleinschreibung. Für eine Prüfung ohne Berücksichtigung der Groß-/Kleinschreibung normalisiert man den String zunächst mit strtolower():

<?php

echo strspn("Hello", "helo");                  // 0 — 'H' is not in the mask
echo "\n";
echo strspn(strtolower("Hello"), "helo");      // 4 — now 'hell' matches

strspn() vs. strcspn()

Die beiden Funktionen sind Spiegelbilder voneinander:

  • strspn() zählt führende Zeichen, die in der Maske enthalten sind.
  • strcspn() zählt führende Zeichen, die nicht in der Maske enthalten sind (sie stoppt beim ersten Zeichen, das in der Maske vorkommt).

So gibt strcspn("Hello World", " ") den Wert 5 zurück — die Anzahl der Zeichen vor dem ersten Leerzeichen. strcspn() bietet sich an, wenn man wissen möchte, wie weit es bis zum ersten „verbotenen" Zeichen (z. B. einem Trennzeichen) ist. Weitere Details unter strcspn().

Verwandte Funktionen

  • strcspn() — das Gegenstück; zählt führende Zeichen, die nicht in der Maske enthalten sind.
  • strpos() — findet die Position des ersten Vorkommens eines Teilstrings.
  • substr() — extrahiert einen Teil eines Strings, oft in Kombination mit strspn(), um das übereinstimmende Segment auszuschneiden.
  • strlen() — gibt die Gesamtlänge eines Strings zurück.

Fazit

strspn() beantwortet eine präzise Frage: Wie lang ist die Folge erlaubter Zeichen am Anfang dieses Strings? Die Funktion ist schnell, ohne Abhängigkeiten und bestens geeignet für Validierungen und einfache Parsing-Aufgaben. Zu beachten ist, dass sie case-sensitive und bytebasiert arbeitet, beim ersten Zeichen außerhalb der Maske stoppt und ihr Gegenstück strcspn() das Gegenteil tut. Mit diesem Wissen lassen sich damit prägnante und effiziente String-Prüfungen schreiben.

Übungen

Übung
Was ist die Hauptaufgabe der Funktion strspn() in PHP?
Was ist die Hauptaufgabe der Funktion strspn() in PHP?
Was this page helpful?