2010-12-28 12 views

risposta

34

Per impostazione predefinita, . non corrisponde a nuove righe - [\s\S] è un trucco su questo problema.
Questo è comune in JavaScript, ma in PHP è possibile utilizzare il flag /s per far corrispondere il punto a tutti i caratteri.

+0

C'è sempre il modificatore 's' ... – BoltClock

+0

Quando compare' .' corrisponde a una nuova riga? – yoyo

+0

@BoltClock - Grazie, stavo proprio per arrivarci, dovevo solo confermare come è fatto in PHP. – Kobi

15

Il meta carattere . corrisponde a qualsiasi carattere tranne una nuova riga. Quindi il pattern .* che viene utilizzato per abbinare qualsiasi cosa non funzionerà se devi uguagliare le newline.

preg_match('/^.*$/',"hello\nworld"); // returns 0 

[\s\S] che è una classe di caratteri di caratteri di spaziatura e caratteri non di spaziatura corrisponde qualsiasi carattere incluso il fine riga in modo da fare [\d\D], [\w\W]. Quindi il tuo pattern [\s\S]* ora corrisponde a qualsiasi cosa.

preg_match('/^[\s\S]$/s',"hello\nworld"); // returns 1 

Un'alternativa per fare . partita nulla (tra cui una nuova riga) è quello di utilizzare un modificatore s.

preg_match('/^.*$/s',"hello\nworld"); // returns 1 

modo alternativo di utilizzare il modificatore s è in-rivestimento come:

preg_match('/^(?s).*(?-s)$/',"hello\nworld"); // returns 1 

(?s) accende la modalità s e (?-s) giri se spento. Una volta disattivato, qualsiasi successivo . non corrisponderà a una nuova riga.

+0

L'ultimo bit modifica solo il comportamento del adiacente '.'? Non ho visto prima quella sintassi. – BoltClock

+0

@BoltClock - è possibile impostare o deselezionare i flag in linea - funziona per tutti i punti finché non lo si deseleziona: '(? Smi). * Abc (? - smi). * ABc' – Kobi

+0

@Kobi: Ah, è davvero fantastico! – BoltClock

1

[\s\S] Un set di caratteri che corrisponde a qualsiasi carattere incluse le interruzioni di riga.

. Corrisponde a qualsiasi carattere tranne interruzioni di riga.