CakeFest 2024: The Official CakePHP Conference

Clases carácter

Un corchete de apertura inicia una clase carácter, finalizada por un corchete de cierre. Un corchete de cierre por sí solo no es especial. Si se requiere un corchete de cierre como un miembro de la clase, éste debería ser el primer carácter de información en la clase (después de un circunflejo inicial, si está presente) o escapado con una barra invertida.

Una clase carácter coincide con un sólo 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 sujeto no debe de estar en el conjunto definido por la clase. Si un circunflejo es requerido en realidad como un 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 carácter [aeiou] coincide con cualquier vocal minúscula, mientras que [^aeiou] con cualquier carácter que no sea una vocal minúscula. Observe que un circunflejo es sólo una notación conveniente para especificar los caracteres que están en la clase enumerando los que no están. Si no es una declaración: aún consume un carácter de la cadena objetivo, y falla si el punto actual está al final de la cadena.

Cuando está establecida la coincidencia insensible a mayúsculas-minúculas, cualquier letra en una clase representa tanto su versión en mayúsculas como minusculas, así, por ejemplo, una clase insensible [aeiou] coincidice con "A" así como con "a", y una clase insensible [^aeiou] no coincide con "A", mientras que una versión sensible lo haría.

El carácter nueva línea nunca es tratado de manera especial en las clases carácter, sin importar el establecimiento de la opción PCRE_DOTALL o PCRE_MULTILINE. Una clase como [^a] siempre coincidirá con una nueva línea.

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

No es posible tener un 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 "]" es escapado con una barra invertida es interpretado como el final del rango, así [W-\]46] es interpretado como un clase individual que contiene un rango seguido de dos caracteres aparte. La representación octal o hexadecimal de "]" también se puede usar al final del rango.

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

Los tipos de caracteres \d, \D, \s, \S, \w, y \W también pueden aparecer en la clase carácter, y añaden a la clase los caracteres que ellos representan. Por ejemplo, [\dABCDEF] coincide con cualquier dígito hexadecimal. Un circunflejo se puede usar convenientemente con los tipos de caracteres en mayúsculas para especificar un conjunto de caracteres más restrictivo que el tipo de coincidencia en minúscula. Por ejemplo, la clase [^\W_] coincide con cualquier letra o dígito, excepto con el subrayado.

Todos los caracteres no alfanuméricos distintos de \, -, ^ (al comienzo) y el ] finalizador no son especiales en una clase carácter, pero no es perjudicial si se escapan. El terminador de patrón siempre es especial y debe ser escapado cuando se usa dentro de una expresión.

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

Clases carácter
alnumletras y dígitos
alphaletras
asciicódigos de caracteres 0 - 127
blankespacio o tabulación solamente
cntrlcaracteres de control
digitdígitos decimales (lo mismo que \d)
graphcaracteres imprimibles, excluyendo el espacio
lowerletras minúsculas
printcaracteres imprimibles, incluyendo el espacio
punctcaracterse imprimibles, excluyendo letras y dígitos
spaceescpacio en blanco (casi lo mismo que \s)
upperletras mayúsculas
wordcaracteres "word" (palabra) (lo mismo 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 caracter VT (código 11). Esto hace que "space" sea diferente de \s, el cuál no incluye VT (por compatibilidad con Perl).

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

En el modo UTF-8, los caracteres con valores mayores que 128 no coinciden con ninguna de las clases carácter POSIX. A partir de PHP 5.3.0 y libpcre 8.10 se han cambiado algunas características para utilizar propiedades de caracteres Unicode, en cuyo caso la restricción mencionada no se aplica. Consulte el » manual de PCRE(3) para más detalles.

Dentro de una clase de caracteres pueden aparecer propiedades de carácter de Unicode. No pueden ser parte de un rango. El carácter menos (-) después de una clase de caracteres de Unicode se comparará literalmente. Intentar finalizar un rango con una propiedad de carácter Unicode resultará en una advertencia.

add a note

User Contributed Notes 4 notes

up
19
greaties at ghvernuft dot nl
2 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
3
Julian
1 year 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
6
wordragon at wrestingcontrol dot com
5 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.
up
-8
php at delegated dot net
5 years ago
Some characters may not work as expected within a custom class. MS double quote for example is unrecognised when included in a class but is recognised otherwise.

ie:
<?php
preg_match_all
('/<a href=("|“)/')
?> will match but
<?php
preg_match_all
('/<a href=["“]/')
?> will not
when applied to <a href=“path">
To Top