"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Секвенци за бегство
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Секвенци за бегство
Референца за `regexp.reference.escape.php` со подобрена типографија и навигација.
Секвенци за бегство
Знакот за коса црта има неколку употреби. Прво, ако е проследено со не-алфанумерички знак, тој го отстранува секое специјално значење што знакот може да го има. Оваа употреба на коса црта како знак за бегство се применува и внатре и надвор од класи на знаци.
Знакот за коса црта има неколку употреби. Прво, ако е проследено со не-алфанумерички знак, тој го отстранува секое специјално значење што знакот може да го има. Оваа употреба на коса црта како знак за бегство се применува и внатре и надвор од класи на знаци.
Забелешка:
На пример, ако сакате да совпаднете со знак "*", пишувате "\*" во шаблонот. Ова се применува без оглед на тоа дали следниот знак инаку би бил толкуван како мета-знак, така што секогаш е безбедно да се претходи не-алфанумерички со "\" за да се специфицира дека претставува самиот себе. Особено, ако сакате да совпаднете со коса црта, пишувате "\\\". strings PHP со единечни и двојни наводници
имаат специјално значење на коса црта. Така, ако \ треба да се совпадне со регуларен израз \\, тогаш "\\\\" или '\\\\' мора да се користи во PHP код. PCRE_EXTENDED Ако шаблон е компајлиран со
опција, празни места во шаблонот (освен во класа на знаци) и знаци помеѓу "#" надвор од класа на знаци и следниот знак за нов ред се игнорираат. Коса црта за бегство може да се користи за вклучување на празно место или знак "#" како дел од шаблонот.
- \a
- Втора употреба на коса црта обезбедува начин за кодирање на знаци што не се печатат во шаблони на видлив начин. Нема ограничување на изгледот на знаци што не се печатат, освен бинарната нула што го завршува шаблонот, но кога шаблон се подготвува со уредување текст, обично е полесно да се користи една од следните секвенци за бегство отколку бинарниот знак што го претставува:
- \cx
- аларм, тоа е, BEL знак (хекс 07)
- \e
- "control-x", каде што x е кој било знак
- \f
- бегство (хекс 1B)
- \n
- прекин на страница (хекс 0C)
- \p{xx}
- нов ред (хекс 0A) знак со својство xx, види unicode својства
- \P{xx}
- за повеќе информации знак со својство xx, види unicode својства
- \r
- знак без својство xx, види
- \R
- враќање на количка (хекс 0D)
- \t
- прекин на линија: совпаѓа \n, \r и \r\n
- \xhh
- таб (хекс 09)
- \ddd
- карактер со октален код ddd, или задна референца
Прецизниот ефект на "\cx" е како што следува: ако "x" е буква од долна црта, се претвора во голема буква. Потоа битот 6 од карактерот (хекс 40) се инвертира. Така "\cz" станува хекс 1A, но "\c{" станува хекс 3B, додека "\c;" станува хекс 7B.
По "\xЗнакот за коса црта има неколку употреби. Прво, ако е проследен со неалфанумерички знак, тој го отстранува секое специјално значење што тој знак може да го има. Оваа употреба на коса црта како знак за бегство се применува и внатре и надвор од класи на знаци. UTF-8 режим, "\x{...}" е дозволено, каде што содржината на заградите е низа од хексадецимални цифри. Се толкува како UTF-8 карактер чиј код број е дадениот хексадецимален број. Оригиналната хексадецимална секвенца за бегство,
\xhh, одговара на двобајтен UTF-8 карактер ако вредноста е поголема од 127.
По "\0" се читаат до две дополнителни октални цифри. Во двата случаи, ако има помалку од две цифри, се користат само оние што се присутни. Така секвенцата "\0\x\07" специфицира две бинарни нули проследени со BEL карактер. Осигурајте се дека ќе обезбедите две цифри по почетната нула ако карактерот што следи е сам по себе октална цифра.
Ракувањето со коса црта проследена со цифра различна од 0 е комплицирано. Надвор од класа на карактери, PCRE ја чита и сите следни цифри како децимален број. Ако бројот е помал од 10, или ако имало барем толку претходни зафаќачки леви загради во изразот, целата секвенца се зема како задна референца. Опис како ова функционира е даден подоцна, по дискусијата за заградени подшари.
Внатре во класа на карактери, или ако децималниот број е поголем од 9 и немало толку зафаќачки подшари, PCRE повторно чита до три октални цифри по косата црта, и генерира еден бајт од најмалку значајните 8 бита од вредноста. Сите следни цифри стојат за себе. На пример:
- \040
- е друг начин за пишување на празно место
- \40
- е истото, под услов да има помалку од 40 претходни зафаќачки подшари
- \7
- секогаш е задна референца
- \11
- може да биде задна референца, или друг начин за пишување таб
- \011
- секогаш е таб
- \0113
- е таб проследен со знакот "3"
- \113
- е знакот со октален код 113 (бидејќи не може да има повеќе од 99 задни референци)
- \377
- е бајт што се состои целосно од битови 1
- \81
- е или задна референца, или бинарна нула проследена со двата знака "8" и "1"
Имајте предвид дека окталните вредности од 100 или поголеми не смеат да бидат воведени со водечка нула, бидејќи никогаш не се читаат повеќе од три октални цифри.
Сите секвенци што дефинираат една бајт вредност може да се користат и внатре и надвор од класи на знаци. Дополнително, внатре во класа на знаци, секвенцата "\b" се толкува како знакот за враќање назад (hex 08). Надвор од класа на знаци има различно значење (види подолу).
Третата употреба на обратна коса црта е за специфицирање на општи типови на знаци:
- \d
- која било децимална цифра
- \D
- кој било знак што не е децимална цифра
- \h
- кој било хоризонтален знак за празно место
- \H
- кој било знак што не е хоризонтален знак за празно место
- \s
- кој било знак за празно место
- \S
- кој било знак што не е знак за празно место
- \v
- кој било вертикален знак за празно место
- \V
- кој било знак што не е вертикален знак за празно место
- \w
- кој било „збор“ знак
- \W
- кој било „не-збор“ знак
Секој пар на ескејп секвенци го дели комплетниот сет на знаци на два дизјунктни множества. Секој даден знак одговара на еден, и само еден, од секој пар.
„Празни“ знаци се HT (9), LF (10), FF (12), CR (13) и празно место (32). Меѓутоа, ако се случува локално-специфично совпаѓање, знаците со код точки во опсегот 128-255 исто така може да се сметаат за празни знаци, на пример, NBSP (A0).
„Збор“ знак е секоја буква или бројка или знакот за подвлекување, односно секој знак што може да биде дел од „word“. Дефиницијата за букви и бројки се контролира со табелите со знаци на PCRE, и може да варира ако се случува локално-специфично совпаѓање. На пример, во „fr“ (француски) локал, некои код точки на знаци поголеми од 128 се користат за акцентирани букви, и тие се совпаѓаат со \w.
Овие секвенци од тип на знак може да се појават и внатре и надвор од класи на знаци. Секоја од нив совпаѓа еден знак од соодветниот тип. Ако моменталната точка на совпаѓање е на крајот од низата на субјектот, сите тие пропаѓаат, бидејќи нема знак за совпаѓање.
Четвртата употреба на обратна коса црта е за одредени едноставни тврдења. Тврдењето специфицира услов што мора да се исполни на одредена точка во совпаѓањето, без да се консумираат знаци од низата на субјектот. Употребата на подшаблони за посложени тврдења е опишана подолу. Тврдењата со обратна коса црта се
- \b
- граничник на збор
- \B
- не е граничник на збор
- \A
- почеток на субјектот (независно од повеќелиниски режим)
- \Z
- крај на субјектот или нов ред на крајот (независно од повеќелиниски режим)
- \z
- крај на субјектот (независно од повеќелиниски режим)
- \G
- прва позиција на совпаѓање во субјектот
Овие тврдења не смеат да се појават во класи на знаци (но имајте предвид дека „\b“ има различно значење, имено знакот за враќање назад, внатре во класа на знаци).
Граничник на збор е позиција во низата на субјектот каде што моменталниот знак и претходниот знак не се совпаѓаат и двата \w or \W (т.е. едниот се совпаѓа
\w а другиот се совпаѓа
\W), или почетокот или крајот на низата ако првиот или последниот знак се совпаѓаат \w, соодветно.
На \A, \ZПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во
\z тврдењата се разликуваат од традиционалните капа и долар (опишани во anchors ) по тоа што тие секогаш се совпаѓаат само на самиот почеток и крај на низата на субјектот, без оглед на поставените опции. Тие не се под влијание на
PCRE_MULTILINE or
PCRE_DOLLAR_ENDONLY
options. Разликата помеѓу \Z and
\z е што \Z одговара пред нов ред што е последниот знак од низата, како и на крајот од низата, додека \z одговара само на крајот.
На \G тврдењето е точно само кога моменталната позиција на совпаѓање е на почетната точка на совпаѓањето, како што е наведено од offset аргументот на
preg_match(). Се разликува од \A
кога вредноста на offset е различно од нула.
\Q and \E може да се користи за игнорирање на regexp мета-знаци во шемата. На пример:
\w+\Q.$.\E$ ќе одговара на еден или повеќе зборни знаци, проследени со литерали .$. и закотвени на крајот од низата. Забележете дека ова не ја менува одликата на разграничувачите; на пример шемата #\Q#\E#$
не е валидна, бидејќи вториот # го означува крајот на шемата, а \E# се толкува како невалидни модификатори.
\K може да се користи за ресетирање на почетокот на совпаѓањето. На пример, шемата foo\Kbar одговара на "foobar", но пријавува дека одговара на "bar". Употребата на
\K не се меша со поставувањето на заробени поднизи. На пример, кога шемата (foo)\Kbar
одговара на "foobar", првата подниза сè уште е поставена на "foo".
Белешки од корисници 6 белешки
Significantly updated version (with new $pat4 utilising \R properly, its results and comments):
Note that there are (sometimes difficult to grasp at first glance) nuances of meaning and application of escape sequences like \r, \R and \v - none of them is perfect in all situations, but they are quite useful nevertheless. Some official PCRE control options and their changes come in handy too - unfortunately neither (*ANYCRLF), (*ANY) nor (*CRLF) is documented here on php.net at the moment (although they seem to be available for over 10 years and 5 months now), but they are described on Wikipedia ("Newline/linebreak options" at https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions) and official PCRE library site ("Newline convention" at http://www.pcre.org/original/doc/html/pcresyntax.html#SEC17) pretty well. The functionality of \R appears somehow disappointing (with default configuration of compile time option) according to php.net as well as official description ("Newline sequences" at https://www.pcre.org/original/doc/html/pcrepattern.html#newlineseq) when used improperly.
A hint for those of you who are trying to fight off (or work around at least) the problem of matching a pattern correctly at the end ($) of any line in multiple lines mode (/m).
<?php
// Various OS-es have various end line (a.k.a line break) chars:
// - Windows uses CR+LF (\r\n);
// - Linux LF (\n);
// - OSX CR (\r).
// And that's why single dollar meta assertion ($) sometimes fails with multiline modifier (/m) mode - possible bug in PHP 5.3.8 or just a "feature"(?).
$str="ABC ABC\n\n123 123\r\ndef def\rnop nop\r\n890 890\nQRS QRS\r\r~-_ ~-_";
// C 3 p 0 _
$pat1='/\w$/mi'; // This works excellent in JavaScript (Firefox 7.0.1+)
$pat2='/\w\r?$/mi'; // Slightly better
$pat3='/\w\R?$/mi'; // Somehow disappointing according to php.net and pcre.org when used improperly
$pat4='/\w(?=\R)/i'; // Much better with allowed lookahead assertion (just to detect without capture) without multiline (/m) mode; note that with alternative for end of string ((?=\R|$)) it would grab all 7 elements as expected
$pat5='/\w\v?$/mi';
$pat6='/(*ANYCRLF)\w$/mi'; // Excellent but undocumented on php.net at the moment (described on pcre.org and en.wikipedia.org)
$n=preg_match_all($pat1, $str, $m1);
$o=preg_match_all($pat2, $str, $m2);
$p=preg_match_all($pat3, $str, $m3);
$r=preg_match_all($pat4, $str, $m4);
$s=preg_match_all($pat5, $str, $m5);
$t=preg_match_all($pat6, $str, $m6);
echo $str."\n1 !!! $pat1 ($n): ".print_r($m1[0], true)
."\n2 !!! $pat2 ($o): ".print_r($m2[0], true)
."\n3 !!! $pat3 ($p): ".print_r($m3[0], true)
."\n4 !!! $pat4 ($r): ".print_r($m4[0], true)
."\n5 !!! $pat5 ($s): ".print_r($m5[0], true)
."\n6 !!! $pat6 ($t): ".print_r($m6[0], true);
// Note the difference among the three very helpful escape sequences in $pat2 (\r), $pat3 and $pat4 (\R), $pat5 (\v) and altered newline option in $pat6 ((*ANYCRLF)) - for some applications at least.
/* The code above results in the following output:
ABC ABC
123 123
def def
nop nop
890 890
QRS QRS
~-_ ~-_
1 !!! /\w$/mi (3): Array
(
[0] => C
[1] => 0
[2] => _
)
2 !!! /\w\r?$/mi (5): Array
(
[0] => C
[1] => 3
[2] => p
[3] => 0
[4] => _
)
3 !!! /\w\R?$/mi (5): Array
(
[0] => C
[1] => 3
[2] => p
[3] => 0
[4] => _
)
4 !!! /\w(?=\R)/i (6): Array
(
[0] => C
[1] => 3
[2] => f
[3] => p
[4] => 0
[5] => S
)
5 !!! /\w\v?$/mi (5): Array
(
[0] => C
[1] => 3
[2] => p
[3] => 0
[4] => _
)
6 !!! /(*ANYCRLF)\w$/mi (7): Array
(
[0] => C
[1] => 3
[2] => f
[3] => p
[4] => 0
[5] => S
[6] => _
)
*/
?>
Unfortunately, I haven't got any access to a server with the latest PHP version - my local PHP is 5.3.8 and my public host's PHP is version 5.2.17.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).A non breaking space is not considered as a space and cannot be caught by \s.
it can be found with :
- [\xc2\xa0] in utf-8
- \x{00a0} in unicodeNote that there are (sometimes difficult to grasp at first glance) nuances of meaning and application of escape sequences like \r, \R and \v - none of them is perfect in all situations, but they are quite useful nevertheless. Some official PCRE control options and their changes come in handy too - unfortunately neither (*ANYCRLF), (*ANY) nor (*CRLF) is documented here on php.net at the moment (although they seem to be available for over 10 years and 5 months now), but they are described on Wikipedia ("Newline/linebreak options" at https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions) and official PCRE library site ("Newline convention" at http://www.pcre.org/original/doc/html/pcresyntax.html#SEC17) pretty well. The functionality of \R appears somehow disappointing (with default configuration of compile time option) according to php.net as well as official description ("Newline sequences" at https://www.pcre.org/original/doc/html/pcrepattern.html#newlineseq).
A hint for those of you who are trying to fight off (or work around at least) the problem of matching a pattern correctly at the end ($) of any line in multiple lines mode (/m).
<?php
// Various OS-es have various end line (a.k.a line break) chars:
// - Windows uses CR+LF (\r\n);
// - Linux LF (\n);
// - OSX CR (\r).
// And that's why single dollar meta assertion ($) sometimes fails with multiline modifier (/m) mode - possible bug in PHP 5.3.8 or just a "feature"(?).
$str="ABC ABC\n\n123 123\r\ndef def\rnop nop\r\n890 890\nQRS QRS\r\r~-_ ~-_";
// C 3 p 0 _
$pat1='/\w$/mi'; // This works excellent in JavaScript (Firefox 7.0.1+)
$pat2='/\w\r?$/mi';
$pat3='/\w\R?$/mi'; // Somehow disappointing according to php.net and pcre.org
$pat4='/\w\v?$/mi';
$pat5='/(*ANYCRLF)\w$/mi'; // Excellent but undocumented on php.net at the moment
$n=preg_match_all($pat1, $str, $m1);
$o=preg_match_all($pat2, $str, $m2);
$p=preg_match_all($pat3, $str, $m3);
$r=preg_match_all($pat4, $str, $m4);
$s=preg_match_all($pat5, $str, $m5);
echo $str."\n1 !!! $pat1 ($n): ".print_r($m1[0], true)
."\n2 !!! $pat2 ($o): ".print_r($m2[0], true)
."\n3 !!! $pat3 ($p): ".print_r($m3[0], true)
."\n4 !!! $pat4 ($r): ".print_r($m4[0], true)
."\n5 !!! $pat5 ($s): ".print_r($m5[0], true);
// Note the difference among the three very helpful escape sequences in $pat2 (\r), $pat3 (\R), $pat4 (\v) and altered newline option in $pat5 ((*ANYCRLF)) - for some applications at least.
/* The code above results in the following output:
ABC ABC
123 123
def def
nop nop
890 890
QRS QRS
~-_ ~-_
1 !!! /\w$/mi (3): Array
(
[0] => C
[1] => 0
[2] => _
)
2 !!! /\w\r?$/mi (5): Array
(
[0] => C
[1] => 3
[2] => p
[3] => 0
[4] => _
)
3 !!! /\w\R?$/mi (5): Array
(
[0] => C
[1] => 3
[2] => p
[3] => 0
[4] => _
)
4 !!! /\w\v?$/mi (5): Array
(
[0] => C
[1] => 3
[2] => p
[3] => 0
[4] => _
)
5 !!! /(*ANYCRLF)\w$/mi (7): Array
(
[0] => C
[1] => 3
[2] => f
[3] => p
[4] => 0
[5] => S
[6] => _
)
*/
?>
Unfortunately, I haven't got any access to a server with the latest PHP version - my local PHP is 5.3.8 and my public host's PHP is version 5.2.17.