2015-12-08 13 views
6

Ho scritto la regexp ^(?:([1-5])|([1-5]) .*|.* ([1-5])|.* ([1-5]) .*)$ in modo che corrisponda a una cifra autonoma 1-5 o una cifra separata da almeno uno spazio dal resto della stringa. L'ho provato nei servizi online e il risultato è la cifra stessa. Tuttavia, quando si utilizza il codicePerché preg_match restituisce alcuni elementi vuoti?

preg_match('/^(?:([1-5])|([1-5]) .*|.* ([1-5])|.* ([1-5]) .*)$/', 'order 12314124 5', $matches); 

ottengo questo:

Array ([0] => order 12314124 5 [1] => [2] => [3] => 5) 

La [0] elemento è una partita piena che è buono. Ho anticipato che l'elemento [1] è 5 ma è vuoto e c'è un altro elemento vuoto. Perché questi elementi vuoti appaiono?

risposta

3

Se si è utilizzata la regex su regex101.com, tutti i gruppi non partecipanti (ovvero quelli che non corrispondono) sono nascosti. È possibile attivare nelle opzioni:

enter image description here

E li vedrete:

enter image description here

Una rapida soluzione è quella di utilizzare un ramo azzerare (?|...) invece di un gruppo non-cattura (?:...) e accedere al valore $matches[1]:

preg_match('/^(?|([1-5])|([1-5]) .*|.* ([1-5])|.* ([1-5]) .*)$/', 'order 12314124 5', $matches); 
print_r($matches[1]); // => 5 

Vedere il IDEONE demo

+1

grazie mille – onerror

Problemi correlati