View Full Version : [PHP] Espressioni regolari problema ricorrenze esatte
grigor91
06-09-2011, 14:38
Eseguendo questo codice:
<?php
echo preg_match('/b?/', 'abcbbc');
echo '<br/>';
echo preg_match('/b{1}/', 'abcbbc');
?>
ottengo:
1
1
Anche se il carattere 'b' è presente più di 1 volta. Come mai?
direttamente dalla documentazione ufficiale, che non hai letto :P
preg_match() returns the number of times pattern matches. That will be either 0 times (no match) or 1 time because preg_match() will stop searching after the first match. preg_match_all() on the contrary will continue until it reaches the end of subject. preg_match() returns FALSE if an error occurred.
restituisce true o false (0,1) e si ferma,
devi usare preg_match_all() perchè continui :)
grigor91
07-09-2011, 09:02
Il fatto è che il pattern dovrebbe trovare riscontro se la b è presente una e una sola volta, quindi dovrebbe ritornare 0, non 1.
PS: la documentazione ufficiale l'ho letta parecchie volte :D
Il fatto è che il pattern dovrebbe trovare riscontro se la b è presente una e una sola volta, quindi dovrebbe ritornare 0, non 1.
PS: la documentazione ufficiale l'ho letta parecchie volte :D
Direi che hai due approcci possibili. O fai
count( preg_match_all('/b/') ) == 1
Che ti ritorna true se c'è una sola b in tutta la stringa o 0 se non ce ne è neanche una o più di 1.
oppure fai
preg_match_all('/b.*b/')
che matcha se c'è più di una b. Ma se devi controllare se c'è una sola ripetizione di una stringa in un altra fai prima a fare
substr_count("b", "aasdbasdb") == 1
grigor91
08-09-2011, 09:34
Però in un caso più complesso come la validazione di un indirizzo e-mail questi aprocci sono difficilmente realizzabili.
Per esempio in questo caso:
preg_match('/[A-Za-z0-9_][A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.{1}[A-Za-z]{2,4}/', 'prova.test@esempio..it');
la funzione ritorna 1 nonostante non sia un indirizzo valido.
Anche leggendo la documentazione di PHP (http://it.php.net/manual/en/regexp.reference.repetition.php) si nota come il quantificatore '{n}' risulti verificato solo se le occorrenze sono esattamente n:
"Thus [aeiou]{3,} matches at least 3 successive vowels, but may match many more, while \d{8} matches exactly 8 digits."
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.