PDA

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?

les2
06-09-2011, 17:36
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

Kenger
07-09-2011, 18:54
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."