Die PHP-Funktion strcspn() gibt die Länge des Anfangssegments einer Zeichenkette zurück, das keines der angegebenen Zeichen enthält. Der Name steht für “string complement span” – also die Länge des Bereichs, der das Komplement (Gegenteil) der angegebenen Zeichen abdeckt.
Syntax
int strcspn(string $string, string $characters, int $offset = 0, ?int $length = null)
Parameter:
$string – Die zu durchsuchende Zeichenkette $characters – Eine Liste von Zeichen, nach denen gesucht wird $offset (optional) – Startposition in $string $length (optional) – Maximale Länge des zu durchsuchenden Bereichs
Rückgabewert: Die Anzahl der Zeichen am Anfang von $string (bzw. ab $offset), die nicht in $characters vorkommen.
Beispiel 1: Grundlegende Verwendung
<?php
$text = 'Hello World';
/* Wie viele Zeichen am Anfang sind KEINE Vokale? */
echo strcspn($text, 'aeiou');
/* Ausgabe: 1 (nur "H", denn "e" an Position 1 ist ein Vokal) */
/* Wie viele Zeichen am Anfang enthalten kein Leerzeichen? */
echo strcspn($text, ' ');
/* Ausgabe: 5 ("Hello" = 5 Zeichen vor dem Leerzeichen) */
?>
Beispiel 2: Position des ersten Sonderzeichens
<?php
$text = 'Hallo, wie geht es?';
$sonderzeichen = ',.!?;:';
$position = strcspn($text, $sonderzeichen);
echo "Erstes Sonderzeichen an Position: $position";
/* Ausgabe: Erstes Sonderzeichen an Position: 5 */
/* (Das Komma nach "Hallo" steht an Index 5) */
?>
strcspn() vs. strspn()
| Funktion | Zählt | Beispiel |
strcspn() | Zeichen, die nicht in der Liste sind | strcspn('abc123', '0123456789') = 3 |
strspn() | Zeichen, die in der Liste sind | strspn('abc123', 'abc') = 3 |
Hinweis
strcspn() unterscheidet zwischen Groß- und Kleinschreibung. Wenn Sie eine Prüfung unabhängig von der Schreibweise benötigen, wandeln Sie beide Strings vorher mit strtolower() um.
Beispiel 3: Eingabevalidierung mit strcspn()
Ein typischer Anwendungsfall für strcspn() ist die Validierung von Benutzereingaben. Sie können damit prüfen, ob eine Zeichenkette unerlaubte Zeichen enthält. Wenn der Rückgabewert von strcspn() gleich der Länge des gesamten Strings ist, bedeutet das: Keines der verbotenen Zeichen kommt darin vor.
<?php
$benutzername = 'MaxMuster123';
$verboten = ' !@#$%^&*()+=';
if (strcspn($benutzername, $verboten) === strlen($benutzername)) {
echo 'Benutzername ist gueltig.';
} else {
echo 'Benutzername enthaelt ungueltige Zeichen.';
}
/* Ausgabe: Benutzername ist gueltig. */
$ungueltig = 'Max Muster!';
if (strcspn($ungueltig, $verboten) === strlen($ungueltig)) {
echo 'Gueltig.';
} else {
$pos = strcspn($ungueltig, $verboten);
echo 'Ungueltiges Zeichen an Position: ' . $pos;
}
/* Ausgabe: Ungueltiges Zeichen an Position: 3 */
?>
Im ersten Fall enthält der Benutzername keine verbotenen Zeichen, strcspn() gibt also die volle Länge des Strings zurück. Im zweiten Fall steht an Position 3 ein Leerzeichen, das in der Liste der verbotenen Zeichen enthalten ist.
Die optionalen Parameter $offset und $length
Mit dem dritten und vierten Parameter können Sie den Suchbereich innerhalb des Strings einschränken. Der Offset gibt die Startposition an, ab der gesucht wird. Die Länge begrenzt den Bereich auf eine bestimmte Anzahl von Zeichen.
<?php
$text = 'abc-def-ghi';
/* Ab Position 4 suchen (also in "def-ghi") */
echo strcspn($text, '-', 4);
/* Ausgabe: 3 ("def" hat 3 Zeichen vor dem naechsten "-") */
/* Ab Position 0, nur die ersten 3 Zeichen pruefen */
echo strcspn($text, '-', 0, 3);
/* Ausgabe: 3 ("abc" enthaelt keinen Bindestrich) */
?>
Praxisbeispiel: Sicheren Dateinamen prüfen
Bei der Verarbeitung von Datei-Uploads müssen Dateinamen auf potenziell gefährliche Zeichen geprüft werden. Mit strcspn() lässt sich schnell feststellen, ob ein Dateiname nur erlaubte Zeichen enthält.
<?php
function ist_sicherer_dateiname($name) {
$gefaehrlich = '../:*?"<>|';
return strcspn($name, $gefaehrlich) === strlen($name);
}
var_dump(ist_sicherer_dateiname('bild_2024.jpg'));
/* Ausgabe: bool(true) */
var_dump(ist_sicherer_dateiname('../geheim.txt'));
/* Ausgabe: bool(false) */
?>
Die Funktion prüft, ob der Dateiname Zeichen wie Punkte in Kombination mit Schrägstrichen, Sternchen oder Anführungszeichen enthält. Sobald eines dieser Zeichen auftaucht, gibt strcspn() einen Wert kleiner als die Stringlänge zurück.