substr($string, $offset, $length) restituisce la parte di $string che inizia alla posizione $offset (contata da 0) ed è lunga $length caratteri. substr('Hello world', 0, 5) restituisce "Hello". Ometti $length per ottenere tutto fino alla fine.
substr() conta i byte. Per il testo inglese è lo stesso che contare i caratteri, ma non per giapponese, cinese, emoji o lettere accentate. Per quelli usa mb_substr(), mostrata più avanti.
Sintassi
substr(string $string, int $offset, ?int $length = null): string
$offsetè il punto da cui partire.0è il primo carattere. Un valore negativo conta dalla fine.$lengthè quanti byte prendere (in un semplice testo ASCII un byte è un carattere). Un valore negativo ne lascia fuori quel numero alla fine.null(o ometterlo) significa "fino alla fine".
Offset e lunghezza negativi: lavorare dalla fine
Un $offset negativo inizia a contare dalla fine della stringa, quindi -1 è l'ultimo carattere. Una $length negativa si ferma quel numero di caratteri prima della fine.
substr($s, 0, -1) è il modo abituale per rimuovere l'ultimo carattere, per esempio una virgola finale lasciata da un ciclo.
Ottenere il primo o l'ultimo carattere
Per un singolo byte puoi anche indicizzare direttamente la stringa. $s[0] è il primo carattere e, da PHP 7.1, $s[-1] è l'ultimo.
Indicizzare una posizione che non esiste stampa un warning, mentre substr() restituisce semplicemente una stringa vuota. Se la stringa potrebbe essere vuota, preferisci substr().
Fuori intervallo: una stringa vuota, non false
Se $offset è oltre la fine della stringa, substr() restituisce "" in PHP 8. In PHP 7 restituiva false, quindi il vecchio codice che controlla === false non funziona più.
Testo giapponese: usa mb_substr
UTF-8 memorizza i kana e i kanji comuni in 3 byte ciascuno (i kanji rari come 𠮷 e le emoji ne occupano 4). substr() conta i byte, quindi substr('こんにちは', 0, 3) restituisce solo こ, e una lunghezza che non cade al confine di un carattere taglia a metà un carattere e produce testo rotto. mb_substr() accetta gli stessi argomenti e conta i caratteri.
Lo stesso vale per le emoji e le lettere accentate come é. Per contare i caratteri si usa mb_strlen(); vedi strlen() per byte e caratteri.
Accorciare un testo con i puntini di sospensione
Tagliare un titolo lungo per una lista o una scheda è l'uso reale più comune di substr(). Usa mb_substr() così un titolo giapponese non viene mai tagliato a metà carattere, e aggiungi ... solo quando hai davvero accorciato qualcosa.
mb_strimwidth($text, 0, $width, '...') fa lo stesso in base alla larghezza di visualizzazione, dove un carattere giapponese a larghezza piena conta 2 colonne e una lettera latina 1. È adatta ai layout a larghezza fissa.
Contare una sottostringa con substr_count
substr_count($haystack, $needle) restituisce quante volte compare $needle. Distingue maiuscole e minuscole e non conta le corrispondenze sovrapposte.
substr con strpos: testo prima o dopo un carattere
Combina substr() con strpos() per tagliare a un carattere di cui non conosci in anticipo la posizione, come la @ in un indirizzo email:
Verifica che strpos() non abbia restituito false prima di usarne il risultato: se il carattere manca, false viene trattato come 0 senza alcun warning, quindi substr('nobody', 0, $at) restituisce "" e substr('nobody', $at + 1) restituisce "obody".
Domande frequenti
Come ottengo gli ultimi caratteri di una stringa in PHP?
Usa un offset negativo: substr($s, -3) restituisce gli ultimi 3 caratteri. Per un testo che può contenere giapponese o altri caratteri multibyte, usa mb_substr($s, -3).
Qual è la differenza tra substr e mb_substr?
substr() conta i byte e mb_substr() conta i caratteri. In UTF-8 i kana e i kanji comuni occupano 3 byte ciascuno, quindi substr('日本語', 0, 2) taglia a metà un carattere, mentre mb_substr('日本語', 0, 2) restituisce "日本".
Cosa restituisce substr se l'inizio è oltre la fine della stringa?
Una stringa vuota. Da PHP 8.0, substr('abc', 5) restituisce ""; PHP 7 restituiva false.
Come rimuovo l'ultimo carattere di una stringa in PHP?
substr($s, 0, -1) restituisce tutto tranne l'ultimo byte. Usa mb_substr($s, 0, -1) per il testo multibyte, oppure rtrim($s, ',') se vuoi rimuovere solo un carattere finale specifico.
Come conto quante volte compare una sottostringa in PHP?
substr_count($haystack, $needle): substr_count('banana', 'an') restituisce 2. Distingue maiuscole e minuscole e non conta le corrispondenze sovrapposte.