2012-10-01 19 views
18

ho questi dati in una colonna LONGTEXT (in modo che le interruzioni di riga sono trattenuti):PHP preg_match non corrispondenti linea passato rompe

Paragraph one 
Paragraph two 
Paragraph three 
Paragraph four 

Sto cercando di abbinare paragrafo 1 a 3. I sto usando questo codice:

preg_match('/Para(.*)three/', $row['file'], $m); 

Questo non restituisce nulla. Se provo a lavorare solo all'interno della prima riga del paragrafo, abbinando:

preg_match('/Para(.*)one/', $row['file'], $m); 

Poi il codice funziona e ottengo la stringa corretta restituita. Cosa sto facendo di sbagliato qui?

risposta

42

Usa s modificatore.

preg_match('/Para(.*)three/s', $row['file'], $m); 

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

+0

Attenzione: il modificatore '/ s' è avido. Se c'è più di un 'tre' nel testo, la corrispondenza includerà tutto il testo fino all'ultima occorrenza. usa '/ sU' per impedirlo (nota la lettera maiuscola U). –

+1

@FrankForte in realtà non è un problema di modifica: la ripetizione '*' è avida di per sé. Un approccio migliore consiste nel mettere un punto interrogativo per renderlo pigro: '/ Para (. *?) Three/s'. Inoltre, il modificatore '/ U' non cancella l'avidità, ma la inverte:' * 'diventa pigro e' *? 'Diventa avido. Non è un problema sul codice OP, ma può causare strani errori in un'espressione regolare più complessa. –

10

Aggiungere multi-line modifier.

Esempio:

preg_match('/Para(.*)three/m', $row['file'], $m) 
+8

Per chiunque chiedendo circa la differenza tra questo e la risposta accettata (modificatore 's'), il modificatore' s' rende '.' corrisponde a newline così come a tutti gli altri caratteri (di default li esclude), mentre' m' controlla come '^' e '$ 'partita; costringendoli a far corrispondere solo l'inizio e la fine dell'intera stringa (quasi - vedi anche 'D') in contrasto con l'inizio e la fine di ogni riga. – Dave

4

provare a impostare l'espressione regolare per dot-tutti (il parametro extra 's' alla fine), in modo che include interruzioni di riga:

preg_match('/Para(.*)three/s', $row['file'], $m); 
+0

heh. @tassoeven mi ha battuto per farlo! – guiniveretoo

+0

s modificatore per la vittoria – JoshHighland

Problemi correlati