2010-10-26 16 views
21

El carácter . en un php regex acepta todos los caracteres, excepto una nueva línea. ¿Qué puedo usar para aceptar TODOS los caracteres, incluidas las nuevas líneas?PHP Regex Cualquier carácter

Respuesta

38

Esto es comúnmente utilizado para capturar todos los personajes:

[\s\S] 

usted podría utilizar cualquier otra combinación de "Tipo-X + no Tipo-X" de la misma manera:

[\d\D] 
[\w\W] 

pero [\s\S] es reconocido por la convención como una abreviatura de 'realmente nada'.

También puede usar el . si cambia la expresión regular a modo "dotall" (a.k.a "línea única") a través del modificador "s". A veces esa no es una solución viable (regex dinámico en un recuadro negro, por ejemplo, o si no desea modificar el entero regex). En tales casos, las otras alternativas hacen lo mismo, sin importar cómo se configure la expresión regular.

+0

¡Perfecto! ¡Gracias! – Entity

+0

Parece que esto es para un solo personaje en lugar de para todos los personajes .... –

+0

¿Y por qué piensas eso? – Tomalak

8

Es el carácter . que significa "cada carácter" (editar: OP editado). Y hay que añadir la opción s a su expresión regular, por ejemplo:

preg_match("`(.+)`s", "\n"); 
+0

¿No se supone que hay barras diagonales al principio y al final de una expresión regular? – Entity

+5

Puede ser, pero cualquier par de delimitadores servirá. –

+0

No en PHP. Tiene que comenzar y terminar con un delimitador (puede elegirlo), y cada carácter que pase el último delimitador es una opción (es decir, U para desgregado, i para mayúsculas y minúsculas, etc.) –

1

habría

[.\n]+ 

no funciona?

¿Qué tal (.|\n)+? Lo probé y parece funcionar.

Estoy bastante seguro de que esta es la interpretación literal de exactamente lo que estaba pidiendo.

+2

No, no lo haría. – SLaks

+0

El '.' en una clase de caracteres no significa" ningún carácter ". Significa "un punto". Las clases de caracteres tienen su propia sintaxis. ;-) – Tomalak

+0

@Tomalak: Gracias por la explicación, me acabo de dar cuenta ahora. Creo que debería probar mis respuestas antes de publicarlas. He editado mi respuesta ahora. – gnomed

0

Los Manual PHP page for Dot establece que:

Si la opción PCRE_DOTALL se establece, entonces los puntos coinciden con los saltos de línea también.

0

Falta algo importante aquí. [\s\S] coincide con un carácter, mientras que una nueva línea puede ser una secuencia de caracteres. (Windows usa dos caracteres: \r\n). Ni . (con el modificador DOT_ALL) ni [\s\S] coincidirán con la secuencia de nueva línea. La mejor forma de unir cualquier personaje o cualquier nueva línea es (.|\R), "todo excepto una nueva línea o una nueva línea". \R coincide con \n, \r y \r\n.

Cuestiones relacionadas