W3docs

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
ParametroDescrizione
$patternIl delimitatore come espressione regolare, inclusi i delimitatori come /.../.
$subjectLa stringa di input da dividere.
$limitNumero massimo di parti. -1 (predefinito) o 0 significa nessun limite. Quando impostato, l'ultimo elemento contiene il resto non diviso.
$flagsBitmask 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:

php— editable, runs on the server

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 ('/\./') o preg_quote() per input dinamici.
  • Stringhe vuote indesiderate. I delimitatori iniziali/finali creano elementi vuoti — aggiungere PREG_SPLIT_NO_EMPTY per evitarli.

Funzioni correlate

Esercizio

Pratica
Qual è la funzione di preg_split in PHP e quando dovrebbe essere utilizzata?
Qual è la funzione di preg_split in PHP e quando dovrebbe essere utilizzata?
Was this page helpful?