Newsgroup: it.comp.www.php
Titolo: regexp e metacaratteri di ricerca

Nelle RegExp come è il funzionamento dei metacaratteri per la ricerca di 
stringhe, quali '+', '*', '?', '.'  ?
Mi fate qualche esempio, non ho ben capito il moro funzionamento. Le userei 
con la funzione ereg().
saluti tuttorotto 

tuttorotto ha scritto:

devi metterci il carattere di escape prima dei metacaratteri.
Il carattere di escape è:  \

 ereg().
Personalmente ti consiglierei di utilizzare le funzioni Perl-Compatible
invece di quelle POSIX Extended (sono piu' versatili).
[quote 
http://www.php.net/manual/it/reference.pcre.pattern.syntax.php
]
? estende il significato di (, oppure 0 o 1 occorrenza, oppure
occorrenza minima
*  0 o piu occorrenze 
+  1 o piu occorrenze
.  indica qualsiasi carattere tranne "a capo" (per default)
[/quote]
Esempio di utilizzo:
<pre>
<?php 
function simple_preg_match($pattern, $content) {
	if (preg_match($pattern, $content, $matches)) {
		print("Results for $pattern against $content :\r\n");
		print_r($matches);
		print("\r\n");
	} else {
		print("No result for $pattern against $content .\r\n\r\n");
	}
}
// ? => 0 o 1 occorrenza
simple_preg_match('#abc?#', 'ab');
simple_preg_match('#abc?#', 'abc');
// * => 0 o piu' occorrenza
simple_preg_match('#abc*#', 'ab');
simple_preg_match('#abc*#', 'abccc');
// + => 1 o piu' occorrenza
simple_preg_match('#abc+#', 'ab');
simple_preg_match('#abc+#', 'abc');
simple_preg_match('#abc+#', 'abccc');
// . => qualsiasi carattere tranne "a capo"
simple_preg_match('#ab.#', 'ab');
simple_preg_match('#ab.#', 'abc');
simple_preg_match('#ab.#', 'abd');
?>
</pre>
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/


ciao .  . .
dai uno sguardo qui:
http://www.phpbook.it/doku.php?id=reg_expr

 Il carattere di escape č:  \
Sě...ehm... questo lo sapevo, per "valutare" i metacaratteri come stringhe e 
non come caratteri speciali, ma la domanda voleva essere un'altra :-)
ciao tuttorotto 

 invece di quelle POSIX Extended (sono piu' versatili).
Sicuramente, ma prima volevo iniziare da quelle POSIX, poi passerò alle 
altre.

Ok, l'ho provato ma ancora non mi sono chiari alcuni concetti basilari. 
Innanzitutto se parliamo di un range [] di occorrenze è sufficiente un solo 
carattere all'interno dell'intero range oppure almeno un carattere per ogni 
gruppo specificato nel range?
Ad esempio:
[a-z0-9]? Vale a dire 0 o 1 occorrenza da a-z && da 0-9 oppure da a-z || 
0-9?
Se invece applichiamo il metacarattere '?' su una parola, esso si riferisce 
all'ultimo carattere della parola o che altro? Exempio:
pipa?
0 o 1 occorrenza del carattere "a"? Quindi pipa o pipaa e nient'altro?
Non faccio gli esempi per gli altri metacaratteri perché concettualmente è 
lo stesso.
ciao tuttorotto 

 dai uno sguardo qui:
CIao, sì adesso vado a dare un'occhiata. Grazie. Magari poi vi faccio 
qualche esempio di ciò che mi è meno chiaro.
saluti tuttorotto 

 nient'altro?
Riprendendo il codice d'esempio del post precedente:
simple_preg_match('#pipa?#', 'pip');   // identifica "pip"
simple_preg_match('#pipa?#', 'pipa');  // identifica "pipa"
simple_preg_match('#pipa?#', 'pipaa'); // identifica "pipa"
Per identificare interamente la parola "pipa" devi usare sotto-regola
come la seguente:
simple_preg_match('#(pipa)?#', 'pip');
simple_preg_match('#(pipa)?#', 'pipa');
simple_preg_match('#(pipa)?#', 'pipaa');


 simple_preg_match('#ab.#', 'abd');
Nel primo caso qui sopra, secondo la mia intuizione sicuramente sbagliata, 
non c'è corrispondenza perché 'ab' + 1 carattere qualsiasi non trova 
corrispondenza in 'ab', e sembrerebbe ovvio.
Nel secondo caso 'ab'+ un qualsiasi carattere trova corripondenza piena in 
'abc' perché 'c', appunto, è un qualsiasi carattere aggiuntivo.
Nel terzo caso, esattamente come il secondo.
Fammi sapere se ho sono impazzito o se ho intuito bene
ciao tuttorotto

 simple_preg_match('#(pipa)?#', 'pipaa');
E qui vado ancora nel pallone...
Dunque, le parentesi tonde impongono che sia presa in considerazione 
l'intera parola, e fin qui tutto ok.
Primo caso:
perché mi dà questo strano risultato?
Results for #(pipa)?# against pip :
Array
(
    [0] =>
)
Che significa? Se non trova corrispondenza perché il codice non esegue 
l'else?
***************
Secondo caso:
perché dà un array con 2 valori 'pipa'? Non trova 'pipa' una sola volta???
**************
Terzo caso:
Come il secondo...perché due valori?
ciao tuttorotto 

 Come il secondo...perchi due valori?
Perche nel secondo e terzo caso le stringhe fornite ('pipa' e 'pipaa')
contengono la stringa 'pipa'.
[quote 
http://www.php.net/preg_match
]
If matches  is provided, then it is filled with the results of search.
$matches[0] will contain the text that matched the full pattern,
$matches[1]  will have the text that matched the first captured
parenthesized subpattern, and so on.
[/quote]


 qualsiasi carattere ma UN carattere ben definito. 
Vedi sopra.
simple_preg_match('#a.c#', 'ac');
simple_preg_match('#a.c#', 'abc');
simple_preg_match('#a.c#', 'adc');
Con il pattern #a.c#, per esserci corrispondenza la stringa deve essere
a + un qualsiasi caratter + c
Nel primo caso non c'e' corrispondenza perche' nella stringa non c'e'
nessun carattere che faccia da corrispondenza per il meta-carattere "."


 nessun carattere che faccia da corrispondenza per il meta-carattere "."
Ok, benissimo, allora anche qui avevo intuito bene. Adesso questi passaggi 
mi sono chiari. Ti ringrazio per la pazienza. Passo all'altro post.
ciao tuttorotto 

 [/quote]
Quindi $matches[0] è l'intero pattern che ha trovato corrispondenza nella 
stringa di ricerca mentre il secondo (matches[1]) è il primo "elemento" 
nell'espressione regolare delimitato da parentesi (), è corretto?
ciao tuttorotto 

 corretto?
Si. Ogni elemento dell'array $matches con indice superiore a 0 (es. 1,
2, 3) fa riferimento alle varie sotto-regole dell'espressione regolare.
Nel primo caso simple_preg_match('#(pipa)?#', 'pipa'), il risultato
sara':
$matches[0] = 'pipa' per il pattern completo
$matches[1] = 'pipa' per la sotto-regola (pipa)


 $matches[1] = 'pipa' per la sotto-regola (pipa)
Benissimo, ti ringrazio sei stato gentilissimo. Senti, vorrei chiederti un 
parere sulla bibliografia sul php. Io ho "pagine web dinamiche con php e 
mysql" di David Tansley, č un libro che tratta il php e l'sql fornendo 
nozioni basilari ma non approfondisce gli argomenti, sebbene sono rimasto 
molto contento della chiarezza nell'esposizione. Adesso stavo cercando un 
libro che tratti il php a tutto tondo, sia da un punto di vista teorico che 
pratico, quindi un libro che tratta in maniera approfondita il maggior 
numero di argomenti possibili riguardo php in forma sia teorica che pratica 
con degli esempi. So che mi suggerirai di rivolgermi sulle guida ufficiale 
che piů volte hai menzionato, ma io sono un po' alla vecchia maniera, e 
preferirei orientarmi su un libro da sfogliare. Naturalmente in italiano e 
non in lingua straniera, magari in un secondo momento quando mi sentirň piů 
sicuro potrň anche rivolgermi alla guida ufficiale online.
ciao tuttorotto