Start · Sprachen · PHP · Referenz · ctype_punct

ctype_punct

Funktion

Prüft, ob alle Zeichen in <code>$text</code> druckbare Sonderzeichen sind – also weder Buchstaben, noch Ziffern, noch Leerzeichen.

seit PHP 4.0.4 Kategorie: string

Signatur

ctype_punct(string $text): bool

Beschreibung

ctype_punct() gehört zur ctype-Erweiterung und prüft, ob jedes Zeichen im übergebenen String ein druckbares Sonderzeichen (Interpunktions- oder Sonderzeichen) ist. Gemeint sind die ASCII-Zeichen aus den Bereichen 33–47, 58–64, 91–96 und 123–126, also beispielsweise !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ; usw.

Die Funktion ist nützlich, wenn geprüft werden soll, ob eine Eingabe ausschließlich aus Sonderzeichen besteht – etwa bei der Validierung von Trennzeichen-Strings oder der Erkennung unerwünschter Eingaben. Sie gibt true zurück, wenn der String mindestens ein Zeichen hat und jedes Zeichen ein Sonderzeichen im oben genannten Sinne ist.

Wichtig: Leerzeichen, Buchstaben und Ziffern führen stets zu false. Der String muss außerdem nicht leer sein – ein leerer String ergibt immer false. Nicht-ASCII-Zeichen (also Werte über 127) sind ebenfalls nicht erlaubt und liefern false.

Im Vergleich zu regulären Ausdrücken ist ctype_punct() sehr performant, da sie keine Regex-Engine benötigt und direkt auf C-Bibliotheksfunktionen zurückgreift.

Parameter

Name Typ Default Beschreibung
$text Pflicht string Der zu prüfende String. Jedes enthaltene Zeichen muss ein druckbares Sonderzeichen (ASCII 33–47, 58–64, 91–96, 123–126) sein, damit die Funktion true zurückgibt.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn $text nicht leer ist und jedes Zeichen ein druckbares Sonderzeichen darstellt. Andernfalls wird false zurückgegeben – auch bei leerem String.

Beispiele

Grundlegende Verwendung mit verschiedenen Eingaben

<?php
$tests = [
    '!@#$%',      // nur Sonderzeichen
    '...',        // nur Punkte
    'abc',        // nur Buchstaben
    '123',        // nur Ziffern
    '!abc',       // gemischt
    '! @',        // enthält Leerzeichen
    '',           // leerer String
    '-+*/',       // arithmetische Operatoren
];

foreach ($tests as $test) {
    $result = ctype_punct($test) ? 'true' : 'false';
    echo var_export($test, true) . ' => ' . $result . PHP_EOL;
}
'!@#$%' => true '...' => true 'abc' => false '123' => false '!abc' => false '! @' => false '' => false '-+*/' => true

Prüfung eines benutzerdefinierten Trennzeichen-Strings

<?php
function validateSeparator(string $separator): bool {
    if (!ctype_punct($separator)) {
        throw new InvalidArgumentException(
            'Der Separator darf nur aus Sonderzeichen bestehen.'
        );
    }
    return true;
}

$validSeparators = ['---', '===', ':::', '***'];
$invalidSeparators = ['-- ', 'abc', '', '1-2'];

foreach ($validSeparators as $sep) {
    try {
        validateSeparator($sep);
        echo "'{$sep}' ist ein gültiger Separator." . PHP_EOL;
    } catch (InvalidArgumentException $e) {
        echo "Fehler: " . $e->getMessage() . PHP_EOL;
    }
}

foreach ($invalidSeparators as $sep) {
    try {
        validateSeparator($sep);
        echo "'{$sep}' ist ein gültiger Separator." . PHP_EOL;
    } catch (InvalidArgumentException $e) {
        echo "Fehler bei '{$sep}': " . $e->getMessage() . PHP_EOL;
    }
}
'---' ist ein gültiger Separator. '===' ist ein gültiger Separator. ':::' ist ein gültiger Separator. '***' ist ein gültiger Separator. Fehler bei '-- ': Der Separator darf nur aus Sonderzeichen bestehen. Fehler bei 'abc': Der Separator darf nur aus Sonderzeichen bestehen. Fehler bei '': Der Separator darf nur aus Sonderzeichen bestehen. Fehler bei '1-2': Der Separator darf nur aus Sonderzeichen bestehen.

// Wichtig · Fallstricke

Achtung bei Integer-Eingaben (PHP < 8.1): Vor PHP 8.1 akzeptierte ctype_punct() auch Ganzzahlen und interpretierte diese als ASCII-Zeichencodes. Seit PHP 8.1 wird bei nicht-string-Werten eine Deprecation-Warnung ausgegeben; ab PHP 9 wird dies vollständig entfernt. Immer Strings übergeben!

Nur ASCII: Die ctype-Funktionen arbeiten ausschließlich mit dem ASCII-Zeichensatz (0–127). Multibyte-Zeichen (UTF-8, ISO-8859 etc.) führen zu false. Für Unicode-Strings sollte stattdessen preg_match() mit dem /u-Modifier genutzt werden.

Leerer String: Ein leerer String ergibt stets false – dies sollte bei der Validierung bedacht werden.