preg_split
In PHP, preg_split() divide una stringa in un array di sottostringhe usando un'espressione regolare come delimitatore.
Introduzione
preg_split() divide una stringa in un array di sottostringhe, utilizzando
un'espressione regolare per descrivere il delimitatore. È il cugino regex di
explode(): mentre explode() può dividere solo su una
stringa fissa, preg_split() può dividere su un pattern — qualsiasi sequenza
di spazi bianchi, uno di diversi caratteri di punteggiatura, un confine di cifra
e così via.
Questa pagina tratta la firma della funzione, tutti i flag, il valore di ritorno e i pattern pratici (e le insidie) che si incontrano nell'uso reale.
Sintassi
preg_split(
string $pattern,
string $subject,
int $limit = -1,
int $flags = 0
): array|false| Parametro | Descrizione |
|---|---|
$pattern | Il delimitatore come espressione regolare, inclusi i delimitatori come /.../. |
$subject | La stringa di input da dividere. |
$limit | Numero massimo di parti. -1 (predefinito) o 0 significa nessun limite. Quando impostato, l'ultimo elemento contiene il resto non diviso. |
$flags | Bitmask di costanti PREG_SPLIT_* (vedi sotto). Combinabili con ` |
La funzione restituisce un array di sottostringhe in caso di successo, o
false se il pattern non è valido. Non lancia eccezioni — verificare false
(e consultare preg_last_error()) se una
divisione può fallire.
Un esempio di base
Un caso d'uso classico è dividere una stringa su un delimitatore variabile — qui, qualsiasi sequenza di spazi bianchi o virgole:
Il pattern [\s,]+ corrisponde a uno o più caratteri di spazio bianco o
virgola, quindi sia gli spazi che la virgola fungono da delimitatori:
Array
(
[0] => This
[1] => is
[2] => a
[3] => test
[4] => string
)Poiché + è greedy, i delimitatori consecutivi (una virgola e uno spazio)
collassano in un unico punto di divisione invece di produrre elementi vuoti.
I flag
PREG_SPLIT_NO_EMPTY
Senza questo flag, un delimitatore all'inizio o alla fine della stringa — o due
delimitatori consecutivi che il pattern non può unire — produce stringhe vuote
nel risultato. PREG_SPLIT_NO_EMPTY le elimina:
<?php
$string = ',apple,,banana,';
// Without the flag: empty pieces appear.
print_r(preg_split('/,/', $string));
// With the flag: only real values remain.
print_r(preg_split('/,/', $string, -1, PREG_SPLIT_NO_EMPTY));La prima chiamata produce ['', 'apple', '', 'banana', '']; la seconda produce
['apple', 'banana'].
PREG_SPLIT_DELIM_CAPTURE
Se il pattern contiene gruppi di cattura, questo flag include il testo catturato nel risultato — utile quando si desidera mantenere i delimitatori invece di scartarli:
<?php
$expression = '3+5*2-9';
$tokens = preg_split('/([+\-*\/])/', $expression, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($tokens);Il risultato mantiene sia i numeri che gli operatori:
['3', '+', '5', '*', '2', '-', '9'] — esattamente ciò di cui ha bisogno un
piccolo tokenizzatore di espressioni.
PREG_SPLIT_OFFSET_CAPTURE
Ogni elemento diventa una coppia [$substring, $offset], dove $offset è la
posizione in byte nella stringa originale. Comodo quando è necessario sapere
dove si trova ciascun elemento.
Limitare il numero di divisioni
$limit limita il numero di parti restituite; l'ultimo elemento contiene il
resto della stringa non divisa. Questo è il modo idiomatico per dividere "i
primi N campi, poi tutto il resto":
<?php
$logLine = 'ERROR 2024-01-01 Something broke: details here';
// Split into at most 3 parts on whitespace.
$parts = preg_split('/\s+/', $logLine, 3);
print_r($parts);Questo produce ['ERROR', '2024-01-01', 'Something broke: details here'] —
il terzo elemento mantiene gli spazi interni perché il limite è stato raggiunto.
preg_split() vs explode()
Usa explode() quando il delimitatore è una singola
stringa fissa — è più veloce e chiaro. Usa preg_split() quando il delimitatore
è un pattern: spazi variabili, una scelta di caratteri, corrispondenza
case-insensitive, o quando è necessario mantenere i delimitatori tramite
PREG_SPLIT_DELIM_CAPTURE. Per ricomporre un array in una stringa, usa
implode().
Insidie comuni
- Dimenticare i delimitatori del pattern. Il primo argomento è una regex
completa, quindi richiede delimitatori:
'/,/', non','. Passare una stringa senza delimitatori è l'errore più comune per i principianti. - Caratteri speciali non preceduti da escape. Caratteri come
.,+,|e*sono metacaratteri regex. Per dividere su un punto letterale, usare l'escape ('/\./') opreg_quote()per input dinamici. - Stringhe vuote indesiderate. I delimitatori iniziali/finali creano elementi
vuoti — aggiungere
PREG_SPLIT_NO_EMPTYper evitarli.
Funzioni correlate
explode()— divide su un delimitatore stringa fisso.implode()— unisce un array in una stringa.preg_match()/preg_match_all()— trova corrispondenze invece di dividere.preg_replace()— sostituisce testo tramite pattern.