Regex para que coincida con cualquier carácter, incluidas las líneas nuevas


¿Hay una expresión regular que coincida con "todos los caracteres, incluidas las nuevas líneas"?

Por ejemplo, en la expresión regular a continuación, no hay salida de $2 porque (.+?) no incluye nuevas líneas al hacer coincidir.

$string = "START Curabitur mollis, dolor ut rutrum consequat, arcu nisl ultrices diam, adipiscing aliquam ipsum metus id velit. Aenean vestibulum gravida felis, quis bibendum nisl euismod ut. 

Nunc at orci sed quam pharetra congue. Nulla a justo vitae diam eleifend dictum. Maecenas egestas ipsum elementum dui sollicitudin tempus. Donec bibendum cursus nisi, vitae convallis ante ornare a. Curabitur libero lorem, semper sit amet cursus at, cursus id purus. Cras varius metus eu diam vulputate vel elementum mauris tempor. 

Morbi tristique interdum libero, eu pulvinar elit fringilla vel. Curabitur fringilla bibendum urna, ullamcorper placerat quam fermentum id. Nunc aliquam, nunc sit amet bibendum lacinia, magna massa auctor enim, nec dictum sapien eros in arcu. 

Pellentesque viverra ullamcorper lectus, a facilisis ipsum tempus et. Nulla mi enim, interdum at imperdiet eget, bibendum nec END";

$string =~ /(START)(.+?)(END)/;

print $2;
 152
Author: kurotsuki, 2011-11-29

4 answers

Añadir el s modificador a tu expresión regular para hacer que . coincida con las nuevas líneas:

$string =~ /(START)(.+?)(END)/s;
 143
Author: BoltClock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-28 22:49:18

Si no desea agregar el modificador de expresiones regulares /s (tal vez aún desee que . conserve su significado original en otra parte de la expresión regular), también puede usar una clase de caracteres. Una posibilidad:

[\S\s]

Un carácter que no es un espacio o es un espacio in en otras palabras, cualquier carácter.

También puede cambiar los modificadores localmente en una pequeña parte de la expresión regular, como así:

(?s:.)
 235
Author: ephemient,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-28 23:03:49

Sí, solo tienes que hacer . coincidir con la nueva línea:

$string =~ /(START)(.+?)(END)/s;
 5
Author: FailedDev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-28 22:49:34

Desea utilizar "multilínea".

$string =~ /(START)(.+?)(END)/m;
 -2
Author: nadime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-28 23:02:18