PHP.mk документација

Повторување

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

regexp.reference.repetition.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека regexp.reference.repetition.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
Повторување

Референца за `regexp.reference.repetition.php` со подобрена типографија и навигација.

regexp.reference.repetition.php

Повторување

Повторувањето се специфицира со квантификатори, кои можат да следат по која било од следниве ставки:

  • единечен знак, можно е да е избегнат
  • метакарактерот .
  • класа на знаци
  • обратна референца (види следниот дел)
  • заграден подшаблон (освен ако не е тврдење - види подолу)

Општиот квантификатор за повторување специфицира минимален и максимален број дозволени совпаѓања, со давање на двата броја во кадрасти загради, разделени со запирка. Броевите мора да бидат помали од 65536, а првиот мора да биде помал или еднаков на вториот. На пример: z{2,4} совпаѓа со "zz", "zzz", или "zzzz". Затворачката заграда сама по себе не е специјален знак. Ако вториот број е изоставен, но запирката е присутна, нема горна граница; ако вториот број и запирката се изоставени, квантификаторот специфицира точен број потребни совпаѓања. Така [aeiou]{3,} совпаѓа со најмалку 3 последователни самогласки, но може да совпадне со многу повеќе, додека \d{8} совпаѓа со точно 8 цифри.

Пред PHP 8.4.0, отворачка кадраста заграда што се појавува на позиција каде квантификатор не е дозволен, или оној што не ја следи синтаксата на квантификатор, се зема како литерален знак. На пример: {,6} не е квантификатор, туку литерален стринг од четири знаци. Од PHP 8.4.0, PCRE екстензијата е спакувана со PCRE2 верзија 10.44, која дозволува обрасци како \d{,8} и тие се толкуваат како \d{0,8}. Понатаму, од PHP 8.4.0, дозволени се празни места околу квантификаторите како \d{0 , 8} and \d{ 0 , 8 } се дозволени.

Квантификаторот {0} е дозволен, предизвикувајќи изразот да се однесува како претходната ставка и квантификаторот да не се присутни.

За погодност (и историска компатибилност) трите најчести квантификатори имаат кратенки со еден знак:

Квантификатори со еден знак
* Со оглед на тоа што PHP не диктира специфична кодировка за низите, можеби ќе се запрашате како се кодираат литералите на низите. На пример, дали низата {0,}
+ Со оглед на тоа што PHP не диктира специфична кодировка за низите, можеби ќе се запрашате како се кодираат литералите на низите. На пример, дали низата {1,}
? Со оглед на тоа што PHP не диктира специфична кодировка за низите, можеби ќе се запрашате како се кодираат литералите на низите. На пример, дали низата {0,1}

Можно е да се конструираат бесконечни циклуси со следење на подшаблон што може да совпадне со нула знаци со квантификатор што нема горна граница, на пример: (a?)*

Поранешните верзии на Perl и PCRE даваа грешка при компајлирање за такви обрасци. Сепак, бидејќи постојат случаи каде ова може да биде корисно, таквите обрасци сега се прифаќаат, но ако кое било повторување на подшаблонот навистина не совпадне со нула знаци, циклусот се прекинува присилно.

By default, the quantifiers are "greedy", that is, they match as much as possible (up to the maximum number of permitted times), without causing the rest of the pattern to fail. The classic example of where this gives problems is in trying to match comments in C programs. These appear between the sequences /* and */ and within the sequence, individual * and / characters may appear. An attempt to match C comments by applying the pattern /\*.*\*/ По дифолт, квантификаторите се „алчни“, односно, тие се совпаѓаат колку што е можно повеќе (до максималниот дозволен број пати), без да предизвикаат неуспех на остатокот од шаблонот. Класичен пример каде ова дава проблеми е при обидот за совпаѓање коментари во C програми. Тие се појавуваат помеѓу секвенците /* и */ и во рамките на секвенцата, може да се појават индивидуални * и / знаци. Обидот за совпаѓање C коментари со примена на шаблонот /* first comment */ not comment /* second comment */ на низата

не успева, бидејќи се совпаѓа со целата низа поради алчноста на ставката .*. Меѓутоа, ако квантификаторот е проследен со знак прашалник, тогаш станува мрзлив и наместо тоа се совпаѓа со минималниот можен број пати, така што шаблонот /\*.*?\*/ го прави правилното нешто со C коментарите. Значењето на различните квантификатори инаку не се менува, само претпочитаниот број на совпаѓања. Не ја мешајте оваа употреба на знак прашалник со неговата употреба како квантификатор сам по себе. Бидејќи има две употреби, понекогаш може да се појави удвоен, како во \d??\d што по претпочитање се совпаѓа со една цифра, но може да совпадне со две ако тоа е единствениот начин да се совпадне остатокот од шаблонот.

Ако PCRE_UNGREEDY е поставен (опција што не е достапна во Perl), тогаш квантификаторите не се алчни по дифолт, но индивидуалните може да се направат алчни со проследување со знак прашалник. Со други зборови, тоа го инвертира стандардното однесување.

Квантификаторите проследени со + се „посесивни“. Тие јадат колку што е можно повеќе знаци и не се враќаат за да го совпаднат остатокот од шаблонот. Така .*abc се совпаѓа со „aabc“, но .*+abc не затоа што .*+ ја јаде целата низа. Посесивните квантификатори може да се користат за забрзување на обработката.

Кога еден заграден подшаблон е квантифициран со минимален број повторувања поголем од 1 или со ограничен максимум, се бара повеќе меморија за компајлираниот шаблон, пропорционално на големината на минимумот или максимумот.

Ако еден шаблон започнува со .* или .{0,} и е поставен PCRE_DOTALL опцијата (еквивалентна на /s на Perl), дозволувајќи му на . да совпадне со нови редови, тогаш шаблонот е имплицитно закотвен, бидејќи што и да следи ќе се обиде да се совпадне со секоја позиција на знак во низата на субјектот, така што нема смисла да се обидувате повторно со целокупното совпаѓање на која било позиција по првата. PCRE третира таков шаблон како да е претходено со \A. Во случаи кога е познато дека низата на субјектот не содржи нови редови, вреди да се постави PCRE_DOTALL кога шаблонот започнува со .* за да се добие оваа оптимизација, или алтернативно да се користи ^ за експлицитно означување на закотвување.

Кога еден зафатен подшаблон се повторува, вредноста што е зафатена е поднизата што се совпаднала со последната итерација. На пример, по (tweedle[dume]{3}\s*)+ што се совпаднало со „tweedledum tweedledee“, вредноста на зафатената подниза е „tweedledee“. Меѓутоа, ако има вгнездени зафатени подшаблони, соодветните зафатени вредности можеби биле поставени во претходните итерации. На пример, по /(a|(b))+/ што се совпаѓа со „aba“, вредноста на втората зафатена подниза е „b“.

Белешки од корисници

Нема белешки од корисници за оваа страница.
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.