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Класи на карактери
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Класи на карактери
Референца за `regexp.reference.character-classes.php` со подобрена типографија и навигација.
Класи на карактери
Отворен квадратен заграда воведува класа на знаци, завршена со затворен квадратна заграда. Затворен квадратна заграда сама по себе не е посебна. Ако затворен квадратна заграда е потребна како член на класата, таа треба да биде првиот податочен знак во класата (по почетен циркумфлекс, ако постои) или избегната со коса црта.
Класата на знаци одговара на еден знак во субјектот; знакот мора да биде во множеството знаци дефинирано со класата, освен ако првиот знак во класата не е циркумфлекс, во кој случај знакот на субјектот не смее да биде во множеството дефинирано со класата. Ако циркумфлексот е навистина потребен како член на класата, осигурете се дека не е првиот знак, или избегнете го со коса црта.
На пример, класата на знаци [aeiou] одговара на која било самогласка со мали букви, додека [^aeiou] одговара на кој било знак што не е самогласка со мали букви. Имајте предвид дека циркумфлексот е само пригоден запис за специфицирање на знаците што се во класата со набројување на оние што не се. Тоа не е тврдење: сè уште троши знак од низата на субјектот и не успева ако тековниот покажувач е на крајот на низата.
Кога е поставено нечувствително на големината на буквите (без разлика на големината), сите букви во класа претставуваат и нивни големи и мали верзии, така што, на пример, нечувствително [aeiou] одговара на "A" како и на "a", а нечувствително [^aeiou] не одговара на "A", додека чувствителна (со големина на букви) верзија би одговарала.
Знакот за нов ред никогаш не се третира на посебен начин во класи на знаци, без оглед на поставката на опциите. Класа како што е [^a] секогаш ќе одговара на нов ред. PCRE_DOTALL or PCRE_MULTILINE Знакот минус (цртичка) може да се користи за специфицирање опсег на знаци во класа на знаци. На пример, [d-m] одговара на која било буква помеѓу d и m, вклучително. Ако знак минус е потребен во класа, тој мора да биде избегнат со коса црта или да се појави на позиција каде што не може да се толкува како укажување на опсег, типично како прв или последен знак во класата.
Не е можно да се има буквалниот знак "]" како краен знак на опсег. Образец како [W-]46] се толкува како класа од два знака ("W" и "-") проследена со буквална низа "46]", така што би одговарала на "W46]" или "-46]". Сепак, ако "]" е избегнат со коса црта се толкува како крај на опсег, така што [W-\]46] се толкува како една класа што содржи опсег проследен со два одделни знака. Окталната или хексадецималната репрезентација на "]" исто така може да се користи за завршување на опсег.
Типовите на знаци \d, \D, \s, \S, \w, и \W исто така може да се појават во класа на знаци и да ги додадат знаците што ги одговараат на класата. На пример, [\dABCDEF] одговара на кој било хексадецимален број. Циркумфлексот може погодно да се користи со типовите на знаци со големи букви за да се специфицира поограничено множество знаци отколку што одговара типот со мали букви. На пример, класата [^\W_] одговара на која било буква или број, но не и на подвлекување.
Ranges operate in ASCII collating sequence. They can also be used for characters specified numerically, for example [\000-\037]. If a range that includes letters is used when case-insensitive (caseless) matching is set, it matches the letters in either case. For example, [W-c] is equivalent to [][\^_`wxyzabc], matched case-insensitively, and if character tables for the "fr" locale are in use, [\xc8-\xcb] matches accented E characters in both cases.
Сите неалфанумерички знаци освен \, -, ^ (на почеток) и завршниот ] се неспецијални во класи на знаци, но не штети ако се избегнати. Терминаторот на образецот е секогаш специјален и мора да биде избегнат кога се користи во израз.
Perl поддржува POSIX нотација за класи на знаци. Ова користи имиња затворени во "]" во рамките на затворените квадратни загради. PCRE исто така ја поддржува оваа нотација. На пример, "[[:digit:]%[:alpha:]]" одговара на "0", "1", која било алфабетска буква, или "%". Поддржаните имиња на класи се:
букви и броеви [: and :] код на знаци 0 - 127 [01[:alpha:]%]
само празно место или табулатор
alnum | контролни знаци |
alpha | letters |
ascii | децимални броеви (исто како \d) |
blank | печатени знаци, исклучувајќи празно место |
cntrl | букви со мали букви |
digit | децимални цифри (исто како \d) |
graph | печатење знаци, исклучувајќи го празниот простор |
lower | мали букви |
print | печатење знаци, вклучувајќи празно место |
punct | печатење знаци, исклучувајќи букви и цифри |
space | празно место (не сосема исто како \s) |
upper | големи букви |
word | „збор“ знаци (исто како \w) |
xdigit | хексадецимални цифри |
space знаците се HT (9), LF (10), VT (11), FF (12), CR (13), и празно место (32). Забележете дека оваа листа го вклучува VT знакот (код 11). Ова го прави „празно место“ различно од \s, што не го вклучува VT (за компатибилност со Perl).
Името word е Perl екстензија, и blank е GNU екстензија од Perl 5.8. Друга Perl екстензија е негација, која е означена со ^ знак по двоеточието. На пример,
[12[:^digit:]] одговара на „1“, „2“, или која било не-цифра.
Во UTF-8 режим, знаците со вредности поголеми од 128 не одговараат на ниту една од POSIX класите на знаци. Од libpcre 8.10 некои класи на знаци се променети за да користат Unicode својства на знаци, во кој случај споменатата рестрикција не се применува. Погледнете го » PCRE(3) прирачникот интерполација на низи
Unicode својствата на знаците можат да се појават внатре во класа на знаци. Тие не можат да бидат дел од опсег. Минус (цртичка) знакот по Unicode класа на знаци ќе одговара буквално. Обидот да се заврши опсег со Unicode својство на знак ќе резултира со предупредување.
Белешки од корисници 3 белешки
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"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.