Never put a "once-only subpattern" (?>...) in a "one-line" comment (#, //).
I spent almost 1 day to fix it.
Use a 'C' style comment instead !
PHP Manual says, a "one-line" comment (# , //) ends just before "?>" (PHP end tag).
These letters "?>" in a "one-line" comment (# , //) seems evaluated as a PHP end tag.
<?php
/* (?> */
echo '"C" style comment works !<br>';
# (?>
echo '"one-line" comment';
?>Подшари само еднаш
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Подшари само еднаш
Референца за `regexp.reference.onlyonce.php` со подобрена типографија и навигација.
Подшари само еднаш
Со максимизирање и минимизирање на повторувањето, неуспехот на она што следи нормално предизвикува повторената ставка да се преоцени за да се види дали различен број повторувања дозволува остатокот од моделот да се совпадне. Понекогаш е корисно да се спречи ова, или за да се промени природата на совпаѓањето, или за да се предизвика неуспех порано отколку што инаку би можело, кога авторот на моделот знае дека нема смисла да се продолжи.
Разгледајте, на пример, моделот \d+foo кога се применува на линијата на субјектот
123456bar
По совпаѓањето на сите 6 цифри и потоа неуспехот да се совпадне со "foo", нормалната акција на совпаѓачот е да се обиде повторно со само 5 цифри што се совпаѓаат со ставката \d+, а потоа со 4, и така натаму, пред конечно да пропадне. Еднократните подмодели обезбедуваат средства за специфицирање дека откако еден дел од моделот се совпаднал, тој не треба да се преоценува на овој начин, така што совпаѓачот веднаш би се откажал при неуспехот да се совпадне со "foo" првиот пат. Нотацијата е друг вид специјален заграда, почнувајќи со (?> како во овој пример:
(?>\d+)bar
Овој вид заграда „заклучува“ дел од моделот што го содржи откако ќе се совпадне, а неуспехот понатаму во моделот е спречен да се врати назад во него. Сепак, враќањето назад до претходните ставки работи нормално.
Алтернативен опис е дека подмодел од овој тип се совпаѓа со низата на знаци што би се совпаднал идентичен самостоен модел, ако е закотвен во тековната точка во низата на субјектот.
Еднократните подмодели не се подмодели за снимање. Едноставни случаи како погоре наведениот пример може да се сметаат како максимизирачко повторување што мора да проголта сè што може. Значи, додека и \d+ и \d+? се подготвени да го прилагодат бројот на цифри што ги совпаѓаат за да го натераат остатокот од моделот да се совпадне, (?>\d+) може да совпадне само цела низа од цифри.
Оваа конструкција, се разбира, може да содржи произволно сложени подмодели и може да биде вгнездена.
Еднократните подмодели може да се користат во комбинација со изјави за поглед назад за да се специфицира ефикасно совпаѓање на крајот од низата на субјектот. Разгледајте едноставен модел како
abcd$
кога се применува на долга низа што не се совпаѓа. Бидејќи совпаѓањето напредува од лево кон десно, PCRE ќе бара секоја „a“ во субјектот и потоа ќе види дали она што следи се совпаѓа со остатокот од моделот. Ако моделот е специфициран како
^.*abcd$
тогаш почетниот .* прво се совпаѓа со целата низа, но кога ова ќе пропадне (бидејќи нема следна „a“), тој се враќа назад за да совпадне сè освен последниот знак, потоа сè освен последните два знаци, и така натаму. Уште еднаш, потрагата по „a“ ја покрива целата низа, од десно кон лево, така што немаме подобра состојба. Меѓутоа, ако моделот е напишан како
^(?>.*)(?<=abcd)
тогаш не може да има враќање назад за ставката .*; таа може да совпадне само со целата низа. Следната изјава за поглед назад врши едно тестирање на последните четири знаци. Ако пропадне, совпаѓањето веднаш пропаѓа. За долги низи, овој пристап прави значителна разлика во времето на обработка.
Кога еден модел содржи неограничено повторување во подмодел што самиот може да се повторува неограничен број пати, употребата на еднократен подмодел е единствениот начин да се избегнат некои неуспешни совпаѓања што траат многу долго. Моделот
(\D+|<\d+>)*[!?]
се совпаѓа со неограничен број поднизи што или се состојат од не-цифри, или цифри затворени во <>, проследени со ! или ?. Кога ќе се совпадне, работи брзо. Меѓутоа, ако се примени на
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
потребно е долго време пред да се пријави неуспех. Ова е затоа што низата може да се подели помеѓу двете повторувања на голем број начини и сите мора да се испробаат. (Примерот користеше [!?] наместо еден знак на крајот, бидејќи и PCRE и Perl имаат оптимизација што овозможува брз неуспех кога се користи еден знак. Тие го паметат последниот знак што е потребен за совпаѓање и пропаѓаат рано ако не е присутен во низата.) Ако моделот се промени на
((?>\D+)|<\d+>)*[!?]
низите од не-цифри не можат да се прекинат и неуспехот се случува брзо.