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.