Free hosting | Dominio gratis
Informatic Lab ~ Informatica, Personal Computer, Hardware, Software, Download & Much More!

Reply
Regex, Difficoltà: Media-Alta
Dave Gilmour
view post Posted on 1/11/2007, 14:13Quote

Utente cancellato






Buongiorno a tutti!
In questo breve tutorial vi spiegherò come funzionano le regex, uno strumento abbastanza ostico per i programmatori alle prime armi. Un esempio: quanti di voi capirebbero a cosa serve questa regex?

CODICE
^[a-zA-Z]{5,}$


Innanzitutto, comincio col dire che vi sono due tipi di regex in PHP: quelli normali e quelli in stile Perl; in questo tutorial useremo i primi.

Le regex sono uno strumento potentissimo che servono principalmente a scovare una serie di caratteri (definito pattern) con determinate caratteristiche. Possiamo usare una regex per trovare la parola "topo" all'interno di un testo, per fare un esempio. Questi strumenti, però, vengono soprattutto usati per convalidare alcuni contenuti e per sostituire alcuni caratteri con altri.

STRUTTURA DI UNA REGEX
Le regex iniziano con il carattere ^ e finiscono $.

CODICE
^[a-zA-Z]{5,}$


Le parentesi quadre rinchiudono i caratteri da cercare. In questo caso si cercano tutti i caratteri che vanno da a a z e tutti i caratteri da A a Z.

CODICE
^[a-zA-Z]{5,}$


Attenzione! Se si inserisce il simbolo ^ all'inizio delle parentesi quadre, tutti i caratteri della parentesi verranno esclusi.

Le parentesi graffe rinchiudono due valori: il primo indica la lunghezza minima dei caratteri da cercare, il secondo la lunghezza massima. E' possibile omettere uno o l'altro. In questo caso, i caratteri della parentesi quadra devono avere come lunghezza minima 5.

CODICE
^[a-zA-Z]{5,}$


Vi sono alcuni simboli che si possono utilizzare:

^ - Inizio della regex (inserito all'interno delle parentesi quadre ha valore logico NOT)
$ - Fine della regex
| - Cerca un valore o l'altro (funzione logica OR)
+ - Cerca i caratteri uno o più volte
* - Cerca i caratteri zero o più volte
? - Cerca i caratteri zero o una volta
. - Carattere mancante
\ - Permette l'inserimento di caratteri speciali (ad esempio, \? permette di cercare il punto di domanda)

Ecco una serie di regex spiegate passo dopo passo:

1)
CODICE
^[a]{2,5}$


In questo caso, la regex cerca solamente il carattere a. Perché la richiesta venga soddisfatta, il carattere a dev'essere presente da 2 a 5 volte.

ESATTO: aaa
ERRATO: aaaaaa

2)
CODICE
^[A-Z0-9]+$


In questo caso, i caratteri che vanno da A a Z e da 0 a 9 devono essere ripetuti una o più volte.

ESATTO: A00
ERRATO: a00 (a non è incluso nelle parentesi quadre)


3)
CODICE
^[^A-Z]{,6}$


In questo caso, i caratteri che vanno da A a Z non devono essere inclusi. I caratteri devono essere al massimo 6.

ESATTO: 9645a
ERRATO: A44, gfgdvvc5

FUNZIONI PHP
Ereg:
Ereg restituisce un valore booleano (true o false) per indicare se il pattern (ovvero i caratteri) rispetta la regex.

Per esempio:
CODICE
if (ereg("[a-z]{1,3}","hai"))
{
 echo "OK! Il pattern rispetta la regex!";
}


In questo esempio, usiamo la funzione per vedere se la parola "hai" è formata da caratteri compresi tra a e z ripetuti da una a 3 volte. Essendo vero, lo script mostrerà la frase.

CODICE
if (ereg("[0-9]{1,3}","as44"))
{
 echo "OK! Il pattern rispetta la regex!";
}


In questo caso, invece, lo script non mostrerà nulla. Come mai? La regex non viene rispettata, dato che "as44" contiene più di tre caratteri. Inoltre, le lettere non sono accettate.


Eregi:
Funziona in modo uguale ad ereg, ma il pattern diventa case insensitive, ovvero lo script non farà differenze tra maiuscole e minuscole.

CODICE
if (eregi("[ABC]{1,3}","bc"))
{
 echo "OK! Il pattern rispetta la regex!";
}


In questo caso, la regex viene rispettata, dato che il pattern bc è uguale a BC.

ATTENZIONE!
CODICE
if (ereg("[ABC]{1,3}","a"))
{
 // La frase non sarà visualizzata
 echo "OK! Il pattern rispetta la regex!";
}


Usando ereg, il pattern diventa case sensitive, a è quindi diverso da A.

ereg_replace:
ereg_replace usa le regex per sostituire alcuni elementi della frase. Usiamo un esempio:

CODICE
$frase = "Mi chiamo Marco!";
$frase = ereg_replace("Marco", "Paolo", $frase);
echo $frase;


Come potete vedere, usando ereg_replace abbiamo sostituito un pattern (Marco) con un altro (Paolo). Gli argomenti di ereg_replace sono:

  • Pattern da cercare (Marco)

  • Pattern sostituente (Paolo)

  • La variabile su cui si devono effettuare le modifiche ($frase)

eregi_replace:
Funziona allo stesso modo di ereg_replace, ma i pattern diventano case insensitive.

CODICE
$frase = "Mi chiamo Marco!";
$frase = eregi_replace("marco", "Paolo", $frase);
echo $frase;


Lo script convertirà senza problemi il pattern, nonostante non vi sia l'iniziale minuscola. In questo caso, quindi, Marco è uguale a marco.

ESEMPI
Ecco alcuni esercizi già svolti:

1 - Supponiamo di dover validare un nome utente, identificato nella variabile $user, avente valore "MiK4". La variabile dev'essere composta da almeno 4 caratteri alfanumerici. Scrivere uno script PHP che convalidi il nome utente e che mostri un messaggio di benvenuto nel caso in cui tutte le condizioni risultino soddisfatte. In caso contrario, lo script visualizzerà un messaggio di errore.

Le regex, come detto all'inizio, cercano un determinato pattern. In questo caso, però, dobbiamo validare un nome, ovvero dobbiamo fare in modo che non vi siano caratteri non consentiti. Dobbiamo quindi usare l'operatore ! (NOT), in modo da invertire la richiesta.

CODICE
if(!ereg("[A-Za-z0-9]{4,}", "MiK4"))
{
 echo "Errore!";
} else {
 echo "OK!";
}


SE la regex NON è soddisfatta (ovvero nel caso in cui vi siano anche caratteri non consentiti), mostra un messaggio di errore, ALTRIMENTI scrivi "OK".

2 - Scrivere uno script che sostituisca tutte le lettere s contenute in questa frase con una lettera a scelta.

In questo caso, dobbiamo semplicemente sostituire un pattern con un altro: useremo quindi ereg_replace. (Come lettera sostitutiva useremo la a).

CODICE
$frase = "Scrivere uno script che sostituisca tutte le lettere s contenute in questa frase con una lettera a scelta.";
$frase = ereg_replace("s+","a",$frase);
echo $frase;


Ciao a tutti! :D
 
Top
view post Posted on 22/6/2009, 11:16Quote
Avatar


Group: Member
Posts: 2342


Status: Offline: ultima azione eseguita il 19/12/2009, 12:39


ottimo direi ;)
 
P_MSG P_EMAIL P_MSN Top
1 replies since 1/11/2007, 14:13
 

load
Fast reply

 
 
 

Enable emoticons
Clickable Smilies
Show All


Nickname:      Email:



 

 
 






Milan Passion

Free hosting

Dominio gratis

Imperia was skinned by ~ Sy del 'Cause i Love Skinning!