Menu

PHP preg_match(): espressioni regolari con esempi

preg_match($pattern, $subject, $matches) verifica una stringa con un'espressione regolare e restituisce 1 se corrisponde, 0 altrimenti. Impara i gruppi di cattura, i gruppi con nome, preg_match_all, le ancore, gli schemi di validazione e il modificatore u per UTF-8 e testo giapponese.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

preg_match($pattern, $subject, $matches) verifica se una stringa corrisponde a un'espressione regolare. Restituisce 1 se corrisponde e 0 altrimenti, e riempie $matches con ciò che ha trovato: preg_match('/\d+/', 'Order 4521 shipped', $m) restituisce 1 e imposta $m[0] a "4521".

Lo schema è una stringa racchiusa tra delimitatori, di solito /.../, seguita da modificatori come i. Scrivi gli schemi tra apici singoli: tra virgolette doppie PHP espande prima $name e sequenze di escape come \x41 o \101, quindi il motore delle regex può ricevere uno schema diverso da quello che hai scritto.

Gruppi di cattura

Le parentesi in uno schema catturano la parte della stringa a cui corrispondono. $m[0] è l'intera corrispondenza, $m[1] il primo gruppo, $m[2] il secondo, contati per parentesi aperta da sinistra.

Gruppi con nome

(?<name>...) dà un nome a un gruppo. Il valore viene salvato sotto il nome e sotto il suo numero, così il codice che legge il risultato non si rompe quando qualcuno aggiunge un gruppo prima nello schema.

Trovare ogni corrispondenza con preg_match_all

preg_match_all() continua a cercare dopo la prima corrispondenza e restituisce il numero di corrispondenze. Di default $m[0] contiene tutte le corrispondenze complete e $m[1] tutti i valori del primo gruppo. Con PREG_SET_ORDER ottieni invece un array per corrispondenza, più facile da scorrere con un ciclo.

Validare l'input: ancore, numeri di telefono, codici postali

Per la validazione lo schema deve corrispondere all'intera stringa, quindi inizialo con ^ e terminalo con $. Una trappola: $ corrisponde anche prima di un a capo finale, quindi '/^\d+$/' accetta "123\n". Aggiungi il modificatore D, oppure usa \z, che corrisponde solo alla fine vera e propria.

Per gli indirizzi email, una regex o rifiuta indirizzi validi o ne accetta di non validi. Usa invece filter_var($email, FILTER_VALIDATE_EMAIL) (vedi filter_var()).

Il modificatore u per UTF-8 e testo giapponese

Senza il modificatore u, uno schema lavora sui byte. Un carattere giapponese in UTF-8 occupa tre byte, quindi . corrisponde a un terzo di carattere e le lunghezze risultano sbagliate. Con u, lo schema lavora sui caratteri e puoi usare le classi di proprietà Unicode.

u valida anche la stringa: se non è UTF-8 valido, preg_match() restituisce false invece di cercare corrispondenze.

Applicare l'escape all'input dell'utente con preg_quote

Caratteri come ., +, ?, ( e / hanno significati speciali in uno schema. Se una parte dello schema arriva da una variabile, come un termine di ricerca, passala a preg_quote() con il delimitatore come secondo argomento, altrimenti 1+1 corrisponderà a 11 e una / senza escape rompe lo schema.

Uno schema non valido non lancia eccezioni. PHP stampa un warning e preg_match() restituisce false:

Warning: preg_match(): No ending delimiter '/' found in /path/to/index.php on line 3

Quindi verifica === false (o preg_last_error_msg()) quando lo schema viene costruito a runtime. Per un semplice controllo di sottostringa senza alcuno schema, str_contains() è più veloce e più chiara. Per modificare il testo trovato, usa preg_replace().

Domande frequenti

Cosa restituisce preg_match in PHP?

1 se lo schema corrisponde, 0 se non corrisponde, e false se lo schema stesso non è valido. Dato che 0 e false sono entrambi falsy, confronta con === 1 quando devi distinguere uno schema non valido da una mancata corrispondenza.

Come ottengo il testo trovato da preg_match?

Passa un terzo argomento: preg_match('/(\d+)/', 'Order 4521', $m). Allora $m[0] è l'intera corrispondenza e $m[1] il primo gruppo di cattura, qui entrambi "4521". Con un gruppo con nome (?<id>\d+) il valore si trova anche in $m['id'].

Qual è la differenza tra preg_match e preg_match_all?

preg_match() si ferma alla prima corrispondenza. preg_match_all() trova tutte le corrispondenze, restituisce quante ne ha trovate e riempie $matches con tutte: preg_match_all('/\d+/', 'a1 b22 c333', $m) restituisce 3 e $m[0] è ["1", "22", "333"].

Come uso preg_match con testo giapponese o altro UTF-8?

Aggiungi il modificatore u: preg_match('/^.{3}$/u', '日本語') restituisce 1. Senza u, PHP tratta la stringa come byte, quindi . corrisponde a un byte di un carattere da 3 byte. Con u puoi anche usare classi Unicode come \p{Han}, \p{Hiragana} e \p{Katakana}.

Come verifico se una stringa contiene solo numeri in PHP?

preg_match('/^\d+$/D', $s) oppure, senza regex, ctype_digit($s). Il modificatore D (o \z al posto di $) conta: un semplice $ accetta anche un a capo finale, quindi "123\n" passerebbe.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA