English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PHP正则表达式

In questo tutorial, imparerai come funzionano le espressioni regolari e come utilizzarle in modo efficiente per eseguire match di pattern in PHP.

Cos'è un'espressione regolare

Le espressioni regolari sono comunemente chiamate “ regex ” o “ RegExp ”, è una stringa di testo di formato speciale utilizzata per trovare modelli nel testo. Le espressioni regolari sono uno degli strumenti più potenti disponibili oggi, in grado di elaborare e manipolare il testo in modo efficace. Ad esempio, possono essere utilizzate per verificare se il formato dei dati inseriti dall'utente (ad esempio, nome, email, numero di telefono, ecc.) è corretto, per trovare o sostituire stringhe corrispondenti nel contenuto del testo, ecc.

PHP (versione 5.3 e versioni superiori) supporta le espressioni regolari di stile Perl tramite la serie di funzioni preg_. Perché utilizzare espressioni regolari di stile Perl? Perché Perl (Linguaggio pratico per estrazione e reportÈ il primo linguaggio di programmazione mainstream che offre supporto integrato per le espressioni regolari e è noto per il suo potente supporto alle espressioni regolari e per le straordinarie funzionalità di elaborazione e manipolazione del testo.

Prima di esplorare più a fondo il mondo delle espressioni regolari, diamo un breve introduzione alle funzionalità di match predefinite integrate in PHP.

FunzioneDescrizione
preg_match()Eseguire la corrispondenza dell'espressione regolare.
preg_match_all()Eseguire la corrispondenza dell'espressione regolare globale.
preg_replace()Eseguire la ricerca e la sostituzione dell'espressione regolare.
preg_grep()Restituire gli elementi dell'array di input che corrispondono allo schema.
preg_split()Dividere una stringa in sottostringhe utilizzando l'espressione regolare.
preg_quote()Citare i caratteri di espressione regolare trovati nella stringa.

Attenzione: La funzione preg_match() di PHP si ferma alla ricerca dopo aver trovato la prima corrispondenza, mentre la funzione preg_match_all() continua a cercare fino alla fine della stringa e trova tutte le possibili corrispondenze, non si ferma alla prima corrispondenza.

Grammatica dell'espressione regolare

La grammatica dell'espressione regolare include l'uso di caratteri speciali (non confondere conCaratteri speciali HTMLCaratteri con significato speciale nelle espressioni regolari sono: . * ? + [ ] ( ) { } ^ $ | \. Ogni volta che desideri utilizzare questi caratteri nel loro senso letterale, è necessario utilizzare la barra inversa. Ad esempio, per corrispondere a “.”, è necessario scrivere \. Tutti gli altri caratteri adottano automaticamente il loro senso letterale.

Le seguenti sezioni descrivono le diverse opzioni disponibili per definire uno schema:

Classi di caratteri

Le parentesi quadre intorno a uno schema di caratteri sono chiamate classi di caratteri, ad esempio [ABC]. Le classi di caratteri corrispondono sempre a un singolo carattere della lista specificata, il che significa che l'espressione [abc] corrisponde solo ai caratteri a, b o c.

Puoi anche definire una classe di caratteri negativa per corrispondere a qualsiasi carattere diverso da quelli inclusi tra parentesi. La classe di caratteri negativa è definita aggiungendo il simbolo di spunta (^) subito dopo la parentesi di apertura, ad esempio [^abc].

Puoi anche definire una gamma di caratteri utilizzando il trattino (-) all'interno di un carattere di classe (ad esempio -). Ecco alcuni esempi di caratteri di classe:

Espressione regolareCosa può fare
[abc]Corrisponde a qualsiasi carattere tra a, b o c.
[^abc]Corrisponde a qualsiasi carattere diverso da a, b, c.
[a-z]Corrisponde a qualsiasi carattere tra la lettera minuscola a e la lettera minuscola z.
[A-Z]Corrisponde a qualsiasi carattere tra la lettera maiuscola A e la lettera maiuscola Z.
[a-Z]Corrisponde a qualsiasi carattere tra la lettera minuscola a e la lettera maiuscola Z.
[0-9]Corrisponde a un numero tra 0 e 9.
[a-z0-9]Corrisponde a un singolo carattere tra a e z o tra 0 e 9.

Esempio seguente mostrerà come utilizzare l'espressione regolare e la funzione preg_match() di PHP per trovare se una stringa contiene uno schema:

<?php
$pattern = "/ca[kf]e/";
$text = "He was eating cake in the cafe.";
if(preg_match($pattern, $text)){}}
    echo "Match found!";
} else{
    echo "Match not found.";
}
?>
测试看看‹/›

Analogamente, è possibile utilizzare la funzione preg_match_all() per trovare tutte le occorrenze di abbinamento nella stringa:

<?php
$pattern = "/ca[kf]e/";
$text = "He was eating cake in the cafe.";
$matches = preg_match_all($pattern, $text, $array);
echo $matches . " matches were found.";
?>
测试看看‹/›

Suggerimento:L'espressione regolare non è esclusiva di PHP. Java, Perl, Python e altri linguaggi utilizzano gli stessi simboli per cercare modelli di testo.

Classi predefinite

Alcuni caratteri di classe (ad esempio, numeri, lettere e spazi) vengono utilizzati frequentemente, al punto da avere nomi abbreviati. La tabella seguente elenca quelle classi predefinite:

TrucchiCosa può fare
.Abbinamento di qualsiasi singolo carattere diverso dal newline \n.
\dAbbinamento di qualsiasi carattere numerico. Uguale a [0-9].
\DAbbinamento di qualsiasi carattere non numerico. Uguale a [^0-9]
\sAbbinamento di qualsiasi carattere bianco (spazio, tabulatore, newline o carriage return). Uguale a [\t\n\r]
\SAbbinamento di qualsiasi carattere non vuoto. Uguale a [^\t\n\r]
\wAbbinamento di qualsiasi carattere单词 (definito come a-z, A-Z, 0-9 e underscore). Uguale a [a-zA-Z_0-9]
\WAbbinamento di qualsiasi carattere non单词. Uguale a [^a-Za-Z_0-9]

Esempi seguenti illustreranno come utilizzare l'espressione regolare e la funzione preg_replace() di PHP per cercare e sostituire gli spazi in una stringa:

<?php
$pattern = "/\s/";
$replacement = "-";
$text = "Earth revolves around\nthe\tSun";
//Sostituisci gli spazi, i segni di newline e i tabulatori
echo preg_replace($pattern, $replacement, $text);
echo "<br>";
//Sostituisci solo gli spazi
echo str_replace(" ", "-", $text);
?>
测试看看‹/›

Quantificatori di ripetizione

Nella sezione precedente, abbiamo imparato come abbinare un singolo carattere in vari modi. Ma cosa succede se si desidera abbinare più caratteri? Ad esempio, supponiamo di voler cercare una parola che contiene uno o più esempi della lettera p, o una parola che contiene almeno due p, e così via. Ecco che entrano in gioco i quantificatori. Utilizzando i quantificatori, è possibile specificare il numero di volte che un carattere deve abbinarsi nell'espressione regolare.

La tabella seguente elenca vari metodi per quantificare modelli specifici:

Espressione regolareCosa può fare
p+Corrisponde a una o più lettere p.
p*Corrisponde a zero o più occorrenze dell'lettera p.
p?Corrisponde a zero o una occorrenza dell'lettera p.
p{2}Corrisponde con esattamente due lettere 'p'.
p{2,3}Corrisponde con almeno due ma non più di tre occorrenze della lettera 'p'.
p{2,}

Corrisponde con due o più occorrenze della lettera 'p'.

p{,3}Corrisponde con un massimo di tre occorrenze della lettera 'p'.

Nell'esempio seguente, l'espressione regolare utilizzerà la funzione PHP preg_split() per dividere la stringa in virgole, sequenze di virgole, spazi o la loro combinazione:

<?php
$pattern = "/[\s,]+/";
$text = "My favourite colors are red, green and blue";
$parts = preg_split($pattern, $text);
 
//Cicla attraverso l'array $parts e mostra le sottostringhe
foreach($parts as $part){
    echo $part . "<br>";
}
?>
测试看看‹/›

Anelli di posizione

In alcuni casi, potresti voler abbinare all'inizio o alla fine di una riga, una parola o una stringa. Per fare questo, puoi usare gli anelli. Due anelli comuni sono l'inserto (^) che rappresenta l'inizio della stringa e il simbolo dollaro ($) che rappresenta la fine della stringa.

Espressione regolareCosa può fare
^pCorrisponde con la lettera 'p' all'inizio della riga.
p$Corrisponde con la lettera 'p' alla fine della riga.

Nell'esempio seguente, l'espressione regolare mostrerà solo i nomi dell'array con i nomi che iniziano con la lettera "J" utilizzando la funzione PHP preg_grep():

<?php
$pattern = "/^J/";
$names = array("Jhon Carter", "Clark Kent", "John Rambo");
$matches = preg_grep($pattern, $names);
 
//Esplora l'array $matches e mostra i nomi corrispondenti
foreach($matches as $match){
    echo $match . "<br>";
}
?>
测试看看‹/›

Modificatori di modello

I modificatori di modello ti permettono di specificare il modo in cui deve essere gestita la corrispondenza del modello. I modificatori di modello vengono messi direttamente dopo l'espressione regolare, ad esempio, se si desidera cercare il modello in modo insensibile alle maiuscole e minuscole, si può utilizzare il modificatore 'i', come nella seguente esempio: /pattern/i. La tabella elenca alcuni dei modificatori di modello più comuni.

ModificatoriCosa può fare
iRendi la corrispondenza insensibile alle maiuscole e minuscole.
mModifica il comportamento di '^' e '$' per abbinare i confini di nuova riga (cioè l'inizio o la fine di una riga di stringa multipla), non i confini della stringa.
gEsegui la corrispondenza globale, ovvero trovare tutte le corrispondenze.
oValuta l'espressione una sola volta.
sModifica il comportamento di '.' (punto) per abbinare tutti i caratteri, inclusi i caratteri di nuova riga.
x允许您在正则表达式中使用空格和注释以保持清晰度。

以下示例将向您展示如何使用i修饰符和PHP preg_match_all()函数执行不区分大小写的全局搜索。

<?php
$pattern = "/color/i";
$text = "Color red is more visible than color blue in daylight.";
$matches = preg_match_all($pattern, $text, $array);
echo $matches . " matches were found.";
?>
测试看看‹/›

同样,以下示例显示如何使用^锚点和m修饰符与PHP preg_match_all()函数在多行字符串的每一行的开头进行匹配。

<?php
$pattern = "/^color/im";
$text = "Color red is more visible than \ncolor blue in daylight.";
$matches = preg_match_all($pattern, $text, $array);
echo $matches . " matches were found.";
?>
测试看看‹/›

词边界

单词边界字符(\b)可帮助您搜索以模式开头和/或结尾的单词。例如,正则表达式/\bcar/匹配以模式car开头的单词,并匹配cart, carrot, 或 cartoon,但不匹配oscar。

同样,正则表达式/car\b/匹配以模式car结尾的单词,并且匹配scar, oscar, 或 supercar,但不匹配cart。同样,/\bcar\b/匹配以单词car开头和结尾的单词,并且仅匹配单词car。

以下示例将以粗体突出显示以car开头的单词:

<?php
$pattern = '/\bcar\w*/';
$replacement = '<b>$0</b>';
$text = 'Words begining with car: cart, carrot, cartoon. Words ending with car: scar, oscar, supercar.';
echo preg_replace($pattern, $replacement, $text);
?>
测试看看‹/›

我们希望您已经了解了正则表达式的基础知识。要了解如何使用正则表达式验证表单数据,请查看有关PHP表单验证的教程。