Здравейте, тъй като урока за
Регулярни изрази част 3 (беше редактиран) стана прекалено дълъг за един пост, правя това допълнение към него.Препоръчително е да сте изчели и
част 4-та преди да прочетете този.Тук ще поговорим повече за външните референции
само към групи.Има външни референции към частта от символния низ, който е преди съвпадението - "
$`",след съвпадението - "
$'" или пък целия символен низ - "
$&",но за тях ще ви трябва някой engine за тестване тъй като тези части присъстват в резултата от функциите, които ще изпозлвам.Преди да започнем, нека уточня, че използвам за програмен език
php,съответно и
PCRE функции-те за боравене с регулярни изрази, с които ще показвам примери.Както знаем от урока за регулярни изрази част 3, ако не сме задали име на групата то можем да достъпваме вътрешно до нея в самия шаблон по ред на номерата им - "имаме две групи (a)(b) за да се обърнем към първата група пишем
\1 ,за втората
\2 и т.н, ако имаме повече.".Външните референции се записват по подобен начин, само че използваме "
$" (dollar,долар) последван от номера на групата.
Ето един лесен пример:
$symbol_string = 'happy three friends';
echo preg_replace('/(\w+) (\w+) (\w+)/','Group 1: "$1" ,Group 2: "$2", Group 3: "$3"',$symbol_string);
При версии на езика php от 4.0.4 и нагоре могат да се използват и друго означение за външни референции на групи - две обратно наклонени черти (backslashes)
\\ последвани от номера на групата - "
\\1", "
\\2" и т.н.
Следващия пример е идентичен на горния:
$symbol_string = 'happy three friends';
echo preg_replace('/(\w+) (\w+) (\w+)/','Group 1: "\\1" ,Group 2: "\\2", Group 3: "\\3"',$symbol_string);
Един по-практичен пример(част от BBCode):
$symbol_string = '[b]bold text[/b]';
echo preg_replace('/\[b](.+?)\[\/b]/','<b>$1</b>',$symbol_string);
Дотук, мисля че всичко е ясно когато имаме отделни групи как да определяме техните външни референции, но ако имаме групи вложени в други такива?
$pattern = '/(r(e(g(ular)))) (e(x(pression(s))))/';
Правилото е такова -
започва да се брои от ляво на дясно и от вън на вътре.
В този пример първа група е "
(r(e(g(ular))))", но "
(e(x(pression(s))))" не е втора а пета,вместо това втора е "
(e(g(ular)))"(от вън на вътре) и т.н.
$symbol_string = 'regular expressions';
echo preg_replace('/(r(e(g(ular)))) (e(x(pression(s))))/','I love $1 $5.',$symbol_string);
Външни референции на групите от шаблона ни:
$1 -
regular$2 -
egular$3 -
gular$4 -
ular$5 -
expressions$6 -
xpressions$7 -
pressions$8 -
sА какво става, ако групи с референции към тях се намират в група без референция към нея ? - Ами отново започва да се броят групите с референции от ляво на дясно от вън на вътре:
$pattern = '/(?:h(e(l(lo))))/';
$1 -
ello$2 -
llo$3 -
loАко пък групите с референции съществуват при определени обстоятелства?
$symbol_string = 'regular expressions';
// ами $symbol_string = 'regular bullshits';
echo preg_replace('/(?:(regular) (expressions)?)/','Group 1:"$1" Group 2: "$2", other text: ',$symbol_string);
Ами няма да възникне проблем, ако направим външна референция към несъществуваща група.
Това е едно от нещата, за които бях пропуснал да поговоря в предишните уроци,тъй като това повече зависи вече от самия програмен език и функциите боравещи с регулярни изрази.