Something similar opportunity is DEFINE.
Example:
(?(DEFINE)(?<myname>\bvery\b))(?&myname)\p{Pd}(?&myname).
Expression above will match "very-very" from next sentence:
Define is very-very handy sometimes.
^-------^
How it works. (?(DEFINE)(?<myname>\bvery\b)) - this block defines "myname" equal to "\bvery\b". So, this block "(?&myname)\p{Pd}(?&myname)" equvivalent to "\bvery\b\p{Pd}\bvery\b".Повратни референци
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Повратни референци
Референца за `regexp.reference.back-references.php` со подобрена типографија и навигација.
Повратни референци
Outside a character class, a backslash followed by a digit greater than 0 (and possibly further digits) is a back reference to a capturing subpattern earlier (i.e. to its left) in the pattern, provided there have been that many previous capturing left parentheses.
Надвор од класа на знаци, обратна коса црта проследена со цифра поголема од 0 (и евентуално дополнителни цифри) е обратна референца до претходен (т.е. лево) подшаблон за групирање во шаблонот, под услов да имало толку претходни леви загради за групирање. секвенци за бегство Меѓутоа, ако децималниот број што следи по обратната коса црта е помал од 10, тој секогаш се зема како обратна референца и предизвикува грешка само ако нема толку леви загради за групирање во целиот шаблон. Со други зборови, заградите на кои се упатува не мора да бидат лево од референцата за броеви помали од 10. „Предна обратна референца“ може да има смисла кога е вклучена повторување и подшаблонот десно учествувал во претходна итерација. Погледнете го делот
за понатамошни детали за обработката на цифри што следат по обратна коса црта.
(sens|respons)e and \1ibility
Обратна референца се совпаѓа со она што всушност се совпаднало со подшаблонот за групирање во тековниот стринг на субјектот, наместо со нешто што се совпаѓа со самиот подшаблон. Така, шаблонот
((?i)rah)\s+\1
се совпаѓа со „sense and sensibility“ и „response and responsibility“, но не и со „sense and responsibility“. Ако е вклучено совпаѓање чувствително на големината на буквите (caseful) во моментот на обратната референца, тогаш големината на буквите е релевантна. На пример,
се совпаѓа со „rah rah“ и „RAH RAH“, но не и со „RAH rah“, иако оригиналниот подшаблон за групирање се совпаѓа без да се води сметка за големината на буквите (caselessly).
(a|(bc))\2
Може да има повеќе од една обратна референца до истиот подшаблон. Ако подшаблонот всушност не бил искористен во одреден натпревар, тогаш сите обратни референци до него секогаш пропаѓаат. На пример, шаблонот PCRE_EXTENDED секогаш пропаѓа ако започне да се совпаѓа со „a“ наместо со „bc“. Бидејќи може да има до 99 обратни референци, сите цифри што следат по обратната коса црта се земаат како дел од потенцијален број на обратна референца. Ако шаблонот продолжи со цифрен знак, тогаш мора да се користи некој разграничувач за да се заврши обратната референца. Ако
опцијата е поставена, ова може да биде празно место. Инаку може да се користи празен коментар.
(a|b\1)+
Обратна референца што се појавува внатре во заградите на кои се однесува пропаѓа кога подшаблонот првпат се користи, така што, на пример, (a\1) никогаш не се совпаѓа. Сепак, таквите референци можат да бидат корисни внатре во повторени подшаблони. На пример, шаблонот
На \g се совпаѓа со кој било број на „a“ и исто така „aba“, „ababba“ итн. На секоја итерација на подшаблонот, обратната референца се совпаѓа со стринг од знаци што одговара на претходната итерација. За да функционира ова, шаблонот мора да биде таков што првата итерација не треба да се совпаѓа со обратната референца. Ова може да се направи со помош на алтернација, како во горниот пример, или со квантификатор со минимум нула. \1,
\g1 and \g{1} бегство од низа може да се користи за апсолутно и релативно реферирање на подшаблони. Ова бегство од низа мора да биде проследено со непотпишан број или негативен број, опционално затворен во загради. Низите \g{2}1.
се синонимни едни со други. Употребата на овој шаблон со непотпишан број може да помогне да се отстрани двосмисленоста вродена при користење цифри што следат по обратна коса црта. Низата помага да се разликуваат обратните референци од окталните знаци, а исто така го олеснува имањето обратна референца проследена со литерален број, на пр. \g Употребата на (foo)(bar)\g{-1}
низа со негативен број означува релативна референца. На пример, (foo)(bar)\g{-2}
би се совпаднало со низата „foobarbar“ и
се совпаѓа со „foobarfoo“. Ова може да биде корисно во долги шаблони како алтернатива на следењето на бројот на подшаблони за да се упати на специфичен претходен подшаблон.
(?P=name),
\k<name>, \k'name',
\k{name}, \g{name},
\g<name> or \g'name'.
Белешки од корисници 2 забелешки
The escape sequence \g used as a backreference may not always behave as expected.
The following numbered backreferences refer to the text matching the specified capture group, as documented:
\1
\g1
\g{1}
\g-1
\g{-1}
However, the following variants refer to the subpattern code instead of the matched text:
\g<1>
\g'1'
\g<-1>
\g'-1'
With named backreferences, we may also use the \k escape sequence as well as the (?P=...) construct. The following combinations also refer to the text matching the named capture group, as documented:
\g{name}
\k{name}
\k<name>
\k'name'
(?P=name)
However, these refer to the subpattern code instead of the matched text:
g<name>
\g'name'
In the following example, the capture group searches for a single letter 'a' or 'b', and then the backreference looks for the same letter. Thus, the patterns are expected to match 'aa' and 'bb', but not 'ab' nor 'ba'.
<?php
/* Matches to the following patterns are replaced by 'xx' in the subject string 'aa ab ba bb'. */
$patterns = [
# numbered backreferences (absolute)
'/([ab])\1/', // 'xx ab ba xx'
'/([ab])\g1/', // 'xx ab ba xx'
'/([ab])\g{1}/', // 'xx ab ba xx'
'/([ab])\g<1>/', // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
"/([ab])\g'1'/", // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
'/([ab])\k{1}/', // 'aa ab ba bb' # No group with name "1", backreference to unset group always fails.
'/([ab])\k<1>/', // 'aa ab ba bb' # No group with name "1", backreference to unset group always fails.
"/([ab])\k'1'/", // 'aa ab ba bb' # No group with name "1", backreference to unset group always fails.
'/([ab])(?P=1)/', // NULL # Regex error: "subpattern name must start with a non-digit", (?P=) expects name not number.
# numbered backreferences (relative)
'/([ab])\-1/', // 'aa ab ba bb'
'/([ab])\g-1/', // 'xx ab ba xx'
'/([ab])\g{-1}/', // 'xx ab ba xx'
'/([ab])\g<-1>/', // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
"/([ab])\g'-1'/", // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
'/([ab])\k{-1}/', // 'aa ab ba bb' # No group with name "-1", backreference to unset group always fails.
'/([ab])\k<-1>/', // 'aa ab ba bb' # No group with name "-1", backreference to unset group always fails.
"/([ab])\k'-1'/", // 'aa ab ba bb' # No group with name "-1", backreference to unset group always fails.
'/([ab])(?P=-1)/', // NULL # Regex error: "subpattern name expected", (?P=) expects name not number.
# named backreferences
'/(?<name>[ab])\g{name}/', // 'xx ab ba xx'
'/(?<name>[ab])\g<name>/', // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
"/(?<name>[ab])\g'name'/", // 'xx xx xx xx' # unexpected behavior, backreference matches both 'a' and 'b'.
'/(?<name>[ab])\k{name}/', // 'xx ab ba xx'
'/(?<name>[ab])\k<name>/', // 'xx ab ba xx'
"/(?<name>[ab])\k'name'/", // 'xx ab ba xx'
'/(?<name>[ab])(?P=name)/', // 'xx ab ba xx'
];
foreach ($patterns as $pat)
echo " '$pat',\t// " . var_export(@preg_replace($pat, 'xx', 'aa ab ba bb'), 1) . PHP_EOL;
?>