PHP 8.5.0 Beta 2 available for testing

Clases de caracteres

Un corchete de apertura introduce una clase de caracteres, terminada por un corchete de cierre. Un corchete de cierre por sí solo no es especial. Si se requiere un corchete de cierre como miembro de la clase, debe ser el primer carácter de datos en la clase (después de un circunflejo inicial, si está presente) o escapado con una barra invertida.

Una clase de caracteres coincide con un solo carácter en el sujeto; el carácter debe estar en el conjunto de caracteres definido por la clase, a menos que el primer carácter en la clase sea un circunflejo, en cuyo caso el carácter del sujeto no debe estar en el conjunto definido por la clase. Si se requiere un circunflejo como miembro de la clase, asegúrese de que no sea el primer carácter, o escápelo con una barra invertida.

Por ejemplo, la clase de caracteres [aeiou] coincide con cualquier vocal minúscula, mientras que [^aeiou] coincide con cualquier carácter que no sea una vocal minúscula. Tenga en cuenta que un circunflejo es solo una notación conveniente para especificar los caracteres que están en la clase enumerando aquellos que no están. No es una afirmación: aún consume un carácter de la cadena de sujeto, y falla si el puntero actual está al final de la cadena.

Cuando se establece la coincidencia sin distinción de mayúsculas y minúsculas, cualquier letra en una clase representa tanto su versión mayúscula como minúscula, por lo que, por ejemplo, una [aeiou] insensible coincide con "A" así como con "a", y una [^aeiou] insensible no coincide con "A", mientras que una versión sensible (con distinción de mayúsculas y minúsculas) sí.

El carácter de nueva línea nunca se trata de manera especial en clases de caracteres, independientemente de la configuración de las opciones PCRE_DOTALL o PCRE_MULTILINE. Una clase como [^a] siempre coincide con una nueva línea.

El carácter de guión puede usarse para especificar un rango de caracteres en una clase de caracteres. Por ejemplo, [d-m] coincide con cualquier letra entre d y m, inclusive. Si se requiere un carácter de guión en una clase, debe escaparse con una barra invertida o aparecer en una posición donde no pueda interpretarse como indicación de un rango, típicamente como el primer o último carácter en la clase.

No es posible tener el carácter literal "]" como el carácter final de un rango. Un patrón como [W-]46] es interpretado como una clase de dos caracteres ("W" y "-") seguido de una cadena literal "46]", por lo que coincidiría con "W46]" o "-46]". Sin embargo, si el "]" se escapa con una barra invertida, se interpreta como el final del rango, por lo que [W-\]46] es interpretado como una sola clase que contiene un rango seguido de dos caracteres separados. También se puede usar la representación octal o hexadecimal de "]" para terminar un rango.

Los rangos operan en la secuencia de clasificación ASCII. También pueden usarse para caracteres especificados numéricamente, por ejemplo [\000-\037]. Si se usa un rango que incluye letras cuando se establece la coincidencia sin distinción de mayúsculas y minúsculas, coincide con las letras en cualquier caso. Por ejemplo, [W-c] es equivalente a [][\^_`wxyzabc], coincidiendo sin distinción de mayúsculas y minúsculas, y si se usan tablas de caracteres para la configuración regional "fr", [\xc8-\xcb] coincide con caracteres E acentuados en ambos casos.

Los tipos de caracteres \d, \D, \s, \S, \w, y \W también pueden aparecer en una clase de caracteres, y añaden los caracteres que coinciden a la clase. Por ejemplo, [\dABCDEF] coincide con cualquier dígito hexadecimal. Un circunflejo puede usarse convenientemente con los tipos de caracteres mayúsculas para especificar un conjunto más restringido de caracteres que el tipo minúscula correspondiente. Por ejemplo, la clase [^\W_] coincide con cualquier letra o dígito, pero no con el guión bajo.

Todos los caracteres no alfanuméricos excepto \, -, ^ (al inicio) y el terminador ] son no especiales en clases de caracteres, pero no causa daño si están escapados. El terminador del patrón es siempre especial y debe escaparse cuando se usa dentro de una expresión.

Perl soporta la notación POSIX para clases de caracteres. Esta usa nombres encerrados por [: y :] dentro de los corchetes de apertura y cierre. PCRE también soporta esta notación. Por ejemplo, [01[:alpha:]%] coincide con "0", "1", cualquier carácter alfabético, o "%". Las clases de nombres soportadas son:

Clases de caracteres
alnumletras y dígitos
alphaletras
asciicódigos de caracteres 0 - 127
blanksolo espacio o tabulación
cntrlcaracteres de control
digitdígitos decimales (igual que \d)
graphcaracteres de impresión, excluyendo espacio
lowerletras minúsculas
printcaracteres de impresión, incluyendo espacio
punctcaracteres de impresión, excluyendo letras y dígitos
spaceespacio en blanco (no exactamente igual que \s)
upperletras mayúsculas
wordcaracteres de "palabra" (igual que \w)
xdigitdígitos hexadecimales
Los caracteres space son HT (9), LF (10), VT (11), FF (12), CR (13), y espacio (32). Observe que esta lista incluye el carácter VT (código 11). Esto hace que "space" sea diferente a \s, que no incluye VT (para compatibilidad con Perl).

El nombre word es una extensión de Perl, y blank es una extensión de GNU de Perl 5.8. Otra extensión de Perl es la negación, que se indica con un carácter ^ después de los dos puntos. Por ejemplo, [12[:^digit:]] coincide con "1", "2", o cualquier no dígito.

En modo UTF-8, los caracteres con valores mayores que 128 no coinciden con ninguna de las clases de caracteres POSIX. A partir de libpcre 8.10, algunas clases de caracteres se cambian para usar propiedades de caracteres Unicode, en cuyo caso la restricción mencionada no se aplica. Consulte el » manual PCRE(3) para obtener más detalles.

Las propiedades de caracteres Unicode pueden aparecer dentro de una clase de caracteres. No pueden ser parte de un rango. El carácter de guión después de una clase de caracteres Unicode coincidirá literalmente. Intentar terminar un rango con una propiedad de caracteres Unicode resultará en una advertencia.

add a note

User Contributed Notes 3 notes

up
24
greaties at ghvernuft dot nl
3 years ago
From deep down the PCRE manual at http://www.pcre.org/pcre.txt :

\d any decimal digit
\D any character that is not a decimal digit
\h any horizontal white space character
\H any character that is not a horizontal white space character
\s any white space character
\S any character that is not a white space character
\v any vertical white space character
\V any character that is not a vertical white space character
\w any "word" character
\W any "non-word" character
up
7
Julian
2 years ago
Examples with Character classes

<?php

$stringA
= "1 In the beginning God created the heavens and the earth.";
$stringB = preg_replace('/[[:^alnum:]]/', '', $stringA); // string(46) "1InthebeginningGodcreatedtheheavensandtheearth"
$stringC = preg_replace('/[[:^alpha:]]/', '', $stringA); // string(45) "InthebeginningGodcreatedtheheavensandtheearth"
$stringD = preg_replace('/[[:^ascii:]]/', '', "Pokémon"); // string(6) "Pokmon"
$stringE = preg_replace('/[[:^blank:]]/', '*', $stringA); // string(57) "* ** *** ********* *** ******* *** ******* *** *** ******"
$stringF = preg_replace('/[[:blank:]]/', '-', $stringA); // string(57) "1-In-the-beginning-God-created-the-heavens-and-the-earth."

$stringG = sprintf("Vertical Tabulation: %s", chr(11)); // string(22) "Vertical Tabulation: "
$stringH = preg_replace('/[[:cntrl:]]/', '', $stringG); // string(21) "Vertical Tabulation: "
$stringLengthG = strlen($stringG); // int(22)
$stringLengthH = strlen($stringH); // int(21)

$stringI = preg_replace('/[[:digit:]]/', '', 'My age is 35'); //string(10) "My age is "
$stringJ = preg_replace('/[[:^digit:]]/', '', 'My age is 35'); // string(2) "35"

$stringK = preg_replace('/[[:^graph:]]/', '', $stringG); // string(19) "VerticalTabulation:"
$stringL = preg_replace('/[[:graph:]]/', '', $stringG); // string(3) " "

$stringM = preg_replace('/[[:lower:]]/', '', $stringG); // string(6) "V T: "
$stringN = preg_replace('/[[:^lower:]]/', '', $stringG); // string(16) "erticalabulation"

$stringO = preg_replace('/[[:^print:]]/', '', $stringG); // string(21) "Vertical Tabulation: "
$stringP = preg_replace('/[[:print:]]/', '', $stringG); // string(1) " "

$stringQ = preg_replace('/[[:punct:]]/', '', $stringG); // string(21) "Vertical Tabulation "
$stringR = preg_replace('/[[:^punct:]]/', '', $stringG); // string(1) ":"

$stringS = preg_replace('/[[:space:]]/', '', $stringG); // string(19) "VerticalTabulation:"
$stringT = preg_replace('/[[:^space:]]/', '', $stringG); // string(3) " "

$stringU = preg_replace('/[[:upper:]]/', '', $stringG); // string(20) "ertical abulation: "
$stringV = preg_replace('/[[:^upper:]]/', '', $stringG); // string(2) "VT"

$stringW = preg_replace('/[[:word:]]/', '', $stringG); // string(4) " : "
$stringX = preg_replace('/[[:^word:]]/', '', $stringG); // string(18) "VerticalTabulation"

$stringY = preg_replace('/[[:xdigit:]]/', '', 'abcdefghijklmnopqrstuvwxyz0123456789'); // string(20) "ghijklmnopqrstuvwxyz"
$stringZ = preg_replace('/[[:^xdigit:]]/', '', 'abcdefghijklmnopqrstuvwxyz0123456789'); // string(16) "abcdef0123456789"
up
7
wordragon at wrestingcontrol dot com
7 years ago
The documentation says:

"The character types \d, \D, \s, \S, \w, and \W may also appear in a character class, and add the characters that they match to the class."

It does not stress that other escape types may not. I wanted to split a string on either a comma (","), or a new line "\n". When my input stream began to include "\r\n", I decided to change "\n" to "\R". Unfortunately, my test string did not include a capital "R", or I might have found the problem sooner. My '/[\R,]/' was simply splitting on comma and the letter "R".

My test string...
"The Yum-Yum Company\r\n127 bernard street"

What DID work: '/(?:\R|,)+/'

["The Yum-Yum Company","127 bernard street"]

Given character classes only match one character, I can see clearly why my expectations were justifiably dashed, but hopefully this comment will save time for someone else.

I might add, this has taught me the value of PCRE_EXTRA (modifier "X"), which I have begun to use routinely now.
To Top