2012-10-01 16 views
18

tengo estos datos en una columna LONGTEXT (por lo que los saltos de línea se conservan):preg_match PHP que no coincida con la línea pasada rompe

Paragraph one 
Paragraph two 
Paragraph three 
Paragraph four 

que estoy tratando de coincidir con el párrafo 1 a 3. Yo Estoy usando este código:

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

Esto no devuelve nada. Si trato de trabajar sólo dentro de la primera línea del párrafo, haciendo coincidir:

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

A continuación, el código funciona y me sale la cadena adecuada regresó. ¿Qué estoy haciendo mal aquí?

Respuesta

42

Uso s modificador.

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

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

+0

Advertencia: el modificador '/ s' es codicioso. Si hay más de un 'tres' en el texto, la coincidencia incluirá todo el texto hasta la última ocurrencia. use '/ sU' para evitar esto (observe la letra mayúscula U). –

+1

@FrankForte no es realmente un problema de modificador: la repetición '*' es codiciosa per se. Un mejor enfoque es poner un signo de interrogación para hacerlo perezoso: '/ Para (. *?) Three/s'. Además, el modificador '/ U' no cancela la codicia, sino que la invierte:' * 'se vuelve floja y' *? 'Se vuelve codicioso. No es un problema en el código OP, pero puede desencadenar errores extraños en una expresión regular más compleja. –

10

Agregue multi-line modifier.

Ej:

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

Para cualquiera se pregunta sobre la diferencia entre esto y la respuesta aceptada (modificador 's'), el modificador' s' hace que '.' coincida con líneas nuevas así como con todos los demás caracteres (por defecto las excluye), mientras que' m' controla cómo '^' y '$ 'partido; forzándolos a coincidir solo con el inicio y el final de la cadena completa (casi - vea también 'D') en lugar del inicio y el final de cada línea. – Dave

4

intente configurar la expresión regular a salpicar todo (el parámetro extra 's' al final), lo que incluye saltos de línea:

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

heh. @tassoeven me ganó! – guiniveretoo

+0

s modificador para la victoria – JoshHighland

Cuestiones relacionadas