2010-02-10 11 views
14

Estoy seguro de que esto es trivial, pero no puedo crear una expresión regular que tenga en cuenta que el tema consta de varias líneas. El modificador "m" para uno no parece funcionar.php preg_replace regex que coincide con varias líneas

+0

¿Está seguro de que la expresión regular es la correcta? – Romain

+0

use msU para obtener más información lea un enlace a continuación http://zendf.wordpress.com/2012/02/08/php-preg_match-multi-line-match/ – Tofeeq

Respuesta

7

¿Has probado el modificador 's'? Significado 'tratar como si fuera una sola línea. 'm' permite usar comienzos y finales de^y $ line.

+0

Ah IC, intentaremos @work mañana. Una pregunta más, ¿cómo puedo unir líneas nuevas, espacios o pestañas? Hasta ahora he llegado a "[\\ n \\ t] *", ¿eso es correcto? –

+0

Simplemente use '\ s', lo que significa cualquier caracter de espacio. –

+0

\ s coincide con 'espacio en blanco' (es decir, \ t y espacio) y creo que puede incluir \ n también cuando se usa con 's'. – ziya

45

Maxwell Troy Milton King tiene razón, pero dado que su respuesta es un poco corta, la publicaré también y proporcionaré algunos ejemplos para ilustrar.

En primer lugar, el carácter meta . de forma predeterminada NO coincide con los saltos de línea. Esto es cierto para muchas implementaciones de expresiones regulares, incluido el sabor de PHP. Dicho esto, toma el texto:

$text = "Line 1\nLine 2\nLine 3"; 

y la expresión regular

'/.*/' 

entonces la expresión regular sólo igualará Line 1. Ver por sí mismo:

preg_match('/.*/', $text, $match); 
echo $match[0]; // echos: 'Line 1' 

ya que el .* "deje de juego" en el \n (Nuevo car línea). Si quieres dejar que coincida con saltos de línea, así, añadir el s-modificador (también conocido como DOT-ALL modificador) al final de su expresión regular:

preg_match('/.*/s', $text, $match); 
echo $match[0]; // echos: 'Line 1\nLine 2\nLine 3' 

Ahora sobre el m-modificador (varias líneas): eso permitirá que el ^ coincida no solo con el inicio de la cadena de entrada, sino también con el inicio de cada línea. Lo mismo con $: permitirá que el $ coincida no solo con el final de la cadena de entrada, sino también con el final de cada línea.

Un ejemplo:

$text = "Line 1\nLine 2\nLine 3"; 
preg_match_all('/[0-9]$/', $text, $matches); 
print_r($matches); 

que coincidirá con sólo el 3 (al final de la entrada). Pero:

pero permitiendo que el m-modificador:

$text = "Line 1\nLine 2\nLine 3"; 
preg_match_all('/[0-9]$/m', $text, $matches); 
print_r($matches); 

todos (solo) dígitos al final de cada línea ('1', '2' y '3') están emparejados.

+3

+1 respuesta fantástica – blak3r

Cuestiones relacionadas