Secuencias de escape

El carácter barra invertida tiene varios usos. El primero es que si está seguido de un carácter no alfanumérico, toma cualquier significado especial que el carácter pueda tener. Este uso de la barra invertida como carácter de escape se aplica tanto dentro como fuera de las clases carácter.

Por ejemplo, si quiere coincidir un carácter "*", escriba "\*" en el patrón. Esto se aplica aunque el siguiente carácter pudiera ser interpretado como un metacarácter, por lo que es mejor asegurarse de preceder un carácter no alfanumérico con "\" para especificar que éste se representa a sí mismo. En particular, si quiere coincidir una barra invertida, escriba "\\".

Nota:

Las cadenas PHP entre comillas simples y dobles tienen un significado especial para la barra invertida. Así, si \ ha de ser comparado con una expresión regular \\, entonces se debe usar "\\\\" o '\\\\' en código PHP.

Si un patrón es compilado con la opción PCRE_EXTENDED, los espacios en blanco en el patrón (distinto de una clase carácter) y los caracteres entre un "#" fuera de una clase carácter y el siguiente carácter de nueva línea se ignoran. Una barra invertida de escape se puede usar para incluir un carácter espacio en blanco o "#" como parte del patrón.

Un segundo uso de la barra invertida proporciona una manera de codificar caracteres no imprimibles en patrones de una forma visible. No hay restricciones en la aparición de los caracteres no imprimibles, excepto para el cero binario el cual finaliza el patrón, pero cuando un patrón está siendo preparado para edición de texto, normalmente es más fácil usar una de las siguientes secuencias de escape en vez del carácter binario que representan:

\a
alarma, es decir, el carácter BEL (07 hex)
\cx
"control-x", donde x es cualquier carácter
\e
escape (1B hex)
\f
salto de página (0C hex)
\n
nueva línea (0A hex)
\p{xx}
un carácter con la propiedad xx, véase propiedades unicode para más información
\P{xx}
un carácter sin la propiedad xx, véase propiedades unicode para más información
\r
retorno de carro (0D hex)
\t
tabulador (09 hex)
\xhh
carácter con el código hexadecimal hh
\ddd
carácter con el código octal ddd, o retroreferencia

El efecto exacto de "\cx" es como sigue: si "x" es una letra minúscula, ésta se convierte a mayúscula. Después se invierte el bit 6 del carácter (40 hex). Así, "\cz" se convierte en 1A hex, pero "\c{" se convierte en 3B hex, mientras que "\c;" se conviente en 7B hex.

Después de "\x", se leen hasta dos dígitos hexadecimales (las letras pueden ser tanto mayúsculas como minúsculas). En modo UTF-8, "\x{...}" es permitido, donde el contenido entre las llaves es una cadena de dígitos hexadecimales. Esto se interpreta como un carácter UTF-8 cuyo número de código es el dado por el número hexadecimal. La secuencia de escape hexadecimal original, \xhh, conincide con un carácter UTF-8 de dos bytes si el valor es mayor que 127.

Después de "\0", se leen hasta dos dígitos octales más. En cualquier caso, si hay menos de dos dígitos, sólo se usan aquéllos que están presentes. Así, la secuencia "\0\x\07" especifica dos ceros binarios seguidos de un carácter BEL. Asegúrese de proporcionar dos dígitos después del cero inicial si el carácter que sigue es también un dígito octal.

El manejo de una barra invertida seguida de un dígito distinto de 0 es complicado. Fuera de una clase carácter, PCRE lee este dígito, así como cualesquiera dígitos siguientes, como un número decimal. Si el número es menor que 10, o si ha habido al menos tantas capturas previas hacia la izquierda en la expresión, la secuencia entera es tomada como una retroreferencia. Una descripción de cómo funciona esto se da más adelante, seguido de una discusión sobre sub-patrones entre paréntesis.

Dentro de una clase carácter, o si el número decimal es mayor que 9 y no han habido tantos sub-patrones de captura, PCRE relee hasta tres dígitos octales siguientes a la barra invertida, y genera un sólo byte de los 8 bits menos significativos del valor. Cualesquiera dígitos subsiguientes se representan a sí mismos. Por ejemplo:

\040
es otra manera de escribir un espacio
\40
es lo mismo, siempre que haya menos de 40 sub-patrones de captura previos
\7
es siempre una retroreferencia
\11
puede ser una retrorefenrencia, u otra manera de escribir una tabulación
\011
es siempre una tabulación
\0113
es una tabulación seguida del carácter "3"
\113
es el carácter con el código octal 113 (ya que no puede haber más de 99 retroreferencias)
\377
es un byte consistente en bits 1 enteramente
\81
es tanto una retroreferencia como un cero binario seguido de los caracteres "8" y "1"

Observe que los valores octales 100 y mayores no deben ser precedidos por un cero inicial, ya que nunca se leen más de tres dígitos octales.

Todas las secuencias que definen un valor de byte único se pueden usar tanto dentro como fuera de las clases carácter. Además, dentro de una clase carácter, la secuencia "\b" se interpreta como el carácter retroceso (08 hex). Fuera de una clase carácter tiene diferentes significados (véase más abajo).

El tercer uso de la barra invertida es parar especificar tipos de caracteres genéricos:

\d
cualquier dígito decimal
\D
cualquier carácter que no es un dígito decimal
\h
cualquier carácter espacio en blanco horizontal (desde PHP 5.2.4)
\H
cualquier carácter que no es un carácter espacio en blanco horizontal (desde PHP 5.2.4)
\s
cualquier carácter espacio en blanco
\S
cualquier carácter que no es un carácter espacio en blanco
\v
cualquier carácter espacio en blanco vertical (desde PHP 5.2.4)
\V
cualquier carácter que no es un carácter espacio en blanco vertical (desde PHP 5.2.4)
\w
cualquier carácter "palabra"
\W
cualquier carácter que no es "palabra"

Cada par de sencuencias de escape divide el conjunto completo de caracteres en dos conjuntos separados. Cualquier carácter dado concide con uno, y sólo uno, de cada par.

Un carácter "palabra" es cualquier letra o dígito o el carácter subrayado, es decir, cualquier carácter que pueda ser parte de una "palabra" Perl. La definición de letras y dígitos está controlada por las tablas de caracteres de PCRE, y pueden variar si tiene lugar la comparación de configuraciones regionales específicas. Por ejemplo, en la configuración regional "fr" (Francés), algunos códigos de caracteres mayores que 128 se usan para letras acentuadas, y éstos se comparan por \w.

Estas secuencias de tipo de caracteres puede aparecer tanto dentro como fuera de las clases carácter. Cada una coincide con un carácter del tipo apropiado. Si el punto de coincidencia actual está al final de la cadena objetivo, todas ellas fallarán, ya que no hay caracteres a comparar.

El cuarto uso de la barra invertida es para ciertas declaraciones simples. Una declaración especifica una condición que se debe encontrar en un punto particular de una comparación, sin consumir ningún carácter de la cadena objetivo. El uso de sub-patrones para declaraciones más complicadas se describe después. Las declaraciones de la barra invertida son

\b
límite de palabra
\B
distinto a límite de palabra
\A
comienzo del sujeto (independientemente del modo multilínea)
\Z
fin del sujeto o nueva línea al final (independientemente del modo multilínea)
\z
final del sujeto (independientemente del modo multilínea)
\G
primera posición de coincidencia del sujeto

Estas declaraciones pueden no aparecer en clases carácter (pero observe que "\b" tiene un significado diferente, a saber, el carácter retroceso, dentro de una clase carácter).

Un límite de palabra es una posición en la cadena objetivo donde el carácter actual y el carácter previo no coinciden con \w o \W (es decir, uno coincide con \w y el otro coincice con \W), o el inicio o final de la cadena si el primer o último carácter coincide con \w, respectivamente.

Las declaraciones \A, \Z, y \z difieren de los tradicionales circumflejo y dólar (descritos después) de modo que siempre coinciden con el inicio y final absolutos de la cadena objetivo, sin importar las opciones que se apliquen. No les afectan las opciones PCRE_MULTILINE o PCRE_DOLLAR_ENDONLY. La diferencia entre \Z y \z es que \Z coincide antes de una nueva línea que es el último carácter de la cadena, además de al final de la cadena, mientras que \z coincide sólo con el final.

La declaración \G es verdadera sólo cuando la posición de comparación actual está al principio del punto de coincidencia, tal como se especifica en el argumento offset de preg_match(). Difiere de \A cuando el valor de offset no es cero.

Se puede usar \Q y \E para ignorar metacaracteres de expresiones regulares. Por ejemplo: \w+\Q.$.\E$ coincidirá con uno o más caracteres palabra, seguidos por los literales .$. y anclados al final de la cadena.

A partir de PHP 5.2.4, \K se puede usar para reiniciar el comienzo de comparación. Por ejemplo, el patrón foo\Kbar coincide con "foobar", pero informa de que ha coincidido con "bar". El uso de \K no interfiere con el parámetro de las cadenas capturadas. Por ejemplo, cuando el patrón (foo)\Kbar coincide con "foobar", la primera sub-cadena está establecida aún a "foo".

add a note add a note

User Contributed Notes 5 notes

up
19
mike at eastghost dot com
2 years ago
"line break" is ill-defined:

 -- Windows uses CR+LF (\r\n)
 -- Linux LF (\n)
 -- OSX CR (\r)

Little-known special character:
\R in preg_* matches all three.

preg_match( '/^\R$/', "match\nany\\n\rline\r\nending\r" ); // match any line endings
up
5
grigor at the domain gatchev.info
2 years ago
As \v matches both single char line ends (CR, LF) and double char (CR+LF, LF+CR), it is not a fixed length atom (eg. is not allowed in lookbehind assertions).
up
4
info at silisoftware dot com
11 months ago
Whitespace matched by \s means only these 5 characters:
 9 = 0x09 = horizontal tab
10 = 0x0A = line feed
12 = 0x0C = form feed
13 = 0x0D = carriage return
32 = 0x20 = space
up
-1
bluemoehre at gmx dot de
3 months ago
Using \R in character classes is NOT possible:

var_dump( preg_match('#\R+#',"\n") ); -> int(1)
var_dump( preg_match('#[\R]+#',"\n") ); -> int(0)
up
-1
collons at ya dot com
6 months ago
The pattern "/\\A/" may be replaced by "/\\\A/" in order to match a "\A" string. Any other escaped "\" looks to work fine so you can use "/\\S/", for instance, to match a "\S" string.
To Top