strspn()
La funzione strspn() in PHP calcola la lunghezza del segmento iniziale di una stringa composto interamente da caratteri contenuti in una maschera specificata.
Introduzione
La funzione strspn() in PHP restituisce la lunghezza del segmento iniziale di una stringa composto interamente da caratteri trovati in una maschera specificata (un insieme di caratteri consentiti). Non appena incontra un carattere che non è nella maschera, smette di contare e restituisce il numero di caratteri corrispondenti fino a quel punto.
Un modo comune di pensarci: "A partire dall'inizio, quanti caratteri appartengono a questo insieme consentito prima di incontrarne uno che non ci appartiene?" Questo rende strspn() utile per la validazione e il parsing leggeri — ad esempio, verificare quante cifre iniziali ha una stringa, o se un valore è composto solo da caratteri consentiti.
Questa pagina tratta la sintassi della funzione, ogni parametro (inclusi i spesso fraintesi $start e $length), diversi esempi eseguibili, insidie comuni e come si relaziona alla sua controparte strcspn().
Sintassi
strspn(string $string, string $characters, int $offset = 0, ?int $length = null): int| Parametro | Descrizione |
|---|---|
$string | La stringa soggetto da esaminare. |
$characters | La maschera — l'insieme di caratteri consentiti nel segmento iniziale. L'ordine dei caratteri non è rilevante. |
$offset | Opzionale. La posizione in $string da cui iniziare il conteggio. Un valore negativo conta dalla fine della stringa. Il valore predefinito è 0. |
$length | Opzionale. Il numero massimo di caratteri da esaminare. Un valore negativo si ferma a quel numero di caratteri dalla fine. Il valore predefinito corrisponde al resto della stringa. |
Valore restituito: un int — la lunghezza del segmento iniziale corrispondente. Se il primo carattere esaminato non è nella maschera, restituisce 0.
Nota: nel manuale ufficiale i parametri sono chiamati
$stringe$characters. Li si può trovare indicati anche come subject e mask — significano la stessa cosa.
Come funziona
La funzione scansiona $string da sinistra a destra (a partire da $offset) e mantiene un conteggio incrementale finché ogni carattere è presente in $characters. La scansione si interrompe al primo carattere che non è nella maschera, e tale conteggio viene restituito. Non guarda mai oltre la prima non corrispondenza, anche se i caratteri successivi avrebbero corrisposto.
strspn() è sensibile alle maiuscole e basata sui byte (opera su singoli byte, quindi non è compatibile con il multibyte/UTF‑8).
Esempio di base
"Hello" (5 caratteri) è composto interamente da lettere presenti nella maschera "HeloWrd". Il carattere successivo è uno spazio, che non è nella maschera, quindi la scansione si interrompe e la funzione restituisce 5. Si noti che la maschera deve solo contenere le lettere consentite — la W, la r e la d sono presenti anche se la scansione non le raggiunge mai.
Contare i caratteri iniziali
Un caso d'uso frequente è misurare quanti caratteri iniziali di un certo tipo ha una stringa — ad esempio, le cifre iniziali:
<?php
$digits = "1234567890";
echo strspn("42 is the answer", $digits); // 2
echo "\n";
echo strspn("abc123", $digits); // 0 — first char 'a' is not a digitPoiché "42 is the answer" inizia con due cifre seguite da uno spazio, il risultato è 2. Nella seconda stringa il primo carattere è una lettera, quindi la funzione restituisce 0 immediatamente.
Utilizzo di $offset e $length
Il parametro opzionale $offset permette di iniziare il conteggio a partire da una posizione intermedia nella stringa, mentre $length limita il numero di caratteri esaminati.
<?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); // 1Un $offset negativo conta dalla fine della stringa, e un $length negativo si ferma a quel numero di caratteri prima della fine — utile quando si vuole ignorare una parte finale.
Insidia della sensibilità alle maiuscole
strspn() distingue maiuscole e minuscole. Se si ha bisogno di un controllo senza distinzione tra maiuscole e minuscole, normalizzare prima la stringa con strtolower():
<?php
echo strspn("Hello", "helo"); // 0 — 'H' is not in the mask
echo "\n";
echo strspn(strtolower("Hello"), "helo"); // 4 — now 'hell' matchesstrspn() vs strcspn()
Le due funzioni sono immagini speculari l'una dell'altra:
strspn()conta i caratteri iniziali che sono nella maschera.strcspn()conta i caratteri iniziali che non sono nella maschera (si ferma al primo carattere che è nella maschera).
Quindi strcspn("Hello World", " ") restituisce 5 — il numero di caratteri prima del primo spazio. Usa strcspn() quando vuoi trovare quanti caratteri mancano al primo carattere "vietato" (come un delimitatore). Vedi strcspn() per i dettagli.
Funzioni correlate
- strcspn() — il complemento; conta i caratteri iniziali non presenti nella maschera.
- strpos() — trova la posizione della prima occorrenza di una sottostringa.
- substr() — estrae una parte di una stringa, spesso combinata con
strspn()per estrarre il segmento corrispondente. - strlen() — ottiene la lunghezza totale di una stringa.
Conclusione
strspn() risponde a una domanda precisa: quanto è lunga la sequenza di caratteri consentiti all'inizio di questa stringa? È veloce, priva di dipendenze e adatta a task di validazione e parsing semplice. Ricorda che è sensibile alle maiuscole e basata sui byte, che si ferma al primo carattere fuori dalla maschera e che la sua controparte strcspn() fa l'inverso. Con queste regole in mente puoi usarla per scrivere controlli sulle stringhe concisi ed efficienti.