preg_match_all('/[\s]{1}(AA|BB|CC)+[\s]{1}/',' AA BB ',$matches);
risultato è AA
, ma ho bisogno di AA
e BB
.PHP: espressioni regolari preg_match non trovare stringhe corrette
preg_match_all('/[\s]{1}(AA|BB|CC)+[\s]{1}/',' AA BB ',$matches);
risultato è AA
, ma ho bisogno di AA
e BB
.PHP: espressioni regolari preg_match non trovare stringhe corrette
I [\s]{1}
sequenze * che si sta utilizzando per abbinare sovrapposizione spazi tra le partite. Lo spazio finale dopo "AA "
è lo stesso spazio precedente a " BB"
. Ogni singolo carattere può essere abbinato solo una volta, quindi dopo che la scansione trova " AA "
cerca solo la rimanente stringa "BB "
per una corrispondenza e non riesce a trovarne uno.
Provare invece la sequenza di fuga limite parola \b
. Questo corrisponde l'inizio e la fine delle parole, ma in realtà non consuma alcun carattere, in modo che possa corrispondere più volte:
preg_match_all('/\b(AA|BB|CC)+\b/', 'AA BB', $matches);
Utilizzando \b
ha l'effetto bonus di non richiedere gli spazi aggiuntivi che hai avuto che circonda la stringa. Puoi passare in 'AA BB'
invece di ' AA BB '
se lo desideri.
* A proposito, [\s]{1}
è la stessa cosa di [\s]
, che è la stessa di un semplice \s
. Non c'è bisogno di parentesi quadre o ricci.
Il problema è che si sta tentando di abbinare lo stesso spazio due volte. Utilizzando uno sguardo in avanti (? = \ S) dovrebbe aiutare:
preg_match_all('/\s(AA|BB|CC)(?=\s)/',' AA BB CC BB AA ',$matches);
Si può fare uno sguardo dietro-positivi:
/(?<=\s)(AA|BB|CC)+\s/
risorse:
Un limite di parola sarà anche corrispondenza (ad es. 'AA; BB; CC', che potrebbe essere un falso positivo. – Matthew