Автор Тема: Допълнение към Регулярни изрази част 3  (Прочетена 3315 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

Stan

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 27
  • -Получени: 135
  • Публикации: 641
Здравейте, тъй като урока за Регулярни изрази част 3 (беше редактиран) стана прекалено дълъг за един пост, правя това допълнение към него.Препоръчително е да сте изчели и част 4-та преди да прочетете този.Тук ще поговорим повече за външните референции само към групи.Има външни референции към частта от символния низ, който е преди съвпадението - "$`",след съвпадението - "$'" или пък целия символен низ - "$&",но за тях ще ви трябва някой engine за тестване тъй като тези части присъстват в резултата от функциите, които ще изпозлвам.Преди да започнем, нека уточня, че използвам за програмен език php,съответно и PCRE функции-те за боравене с регулярни изрази, с които ще показвам примери.Както знаем от урока за регулярни изрази част 3, ако не сме задали име на групата то можем да достъпваме вътрешно до нея в самия шаблон по ред на номерата им - "имаме две групи (a)(b) за да се обърнем към първата група пишем \1 ,за втората \2 и т.н, ако имаме повече.".Външните референции се записват по подобен начин, само че използваме "$" (dollar,долар) последван от номера на групата.

Ето един лесен пример:

Код: PHP
  1. $symbol_string = 'happy three friends';
  2. echo preg_replace('/(\w+) (\w+) (\w+)/','Group 1: "$1" ,Group 2: "$2", Group 3: "$3"',$symbol_string);


При версии на езика php от 4.0.4 и нагоре могат да се използват и друго означение за външни референции на групи - две обратно наклонени черти (backslashes) \\ последвани от номера на групата - "\\1", "\\2" и т.н.
Следващия пример е идентичен на горния:

Код: PHP
  1. $symbol_string = 'happy three friends';
  2. echo preg_replace('/(\w+) (\w+) (\w+)/','Group 1: "\\1" ,Group 2: "\\2", Group 3: "\\3"',$symbol_string);


Един по-практичен пример(част от BBCode):

Код: PHP
  1. $symbol_string = '[b]bold text[/b]';
  2. echo preg_replace('/\[b](.+?)\[\/b]/','<b>$1</b>',$symbol_string);

Дотук, мисля че всичко е ясно когато имаме отделни групи как да определяме техните външни референции, но ако имаме групи вложени в други такива?

Код: PHP
  1. $pattern = '/(r(e(g(ular)))) (e(x(pression(s))))/';

Правилото е такова - започва да се брои от ляво на дясно и от вън на вътре.
В този пример първа група е "(r(e(g(ular))))", но "(e(x(pression(s))))" не е втора а пета,вместо това втора е "(e(g(ular)))"(от вън на вътре) и т.н.

Код: PHP
  1. $symbol_string = 'regular expressions';
  2. 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

А какво става, ако групи с референции към тях се намират в група без референция към нея ? - Ами отново започва да се броят групите с референции от ляво на дясно от вън на вътре:

Код: PHP
  1. $pattern = '/(?:h(e(l(lo))))/';

$1 - ello
$2 - llo
$3 - lo

Ако пък групите с референции съществуват при определени обстоятелства?

Код: PHP
  1. $symbol_string = 'regular expressions';
  2. // ами $symbol_string = 'regular bullshits';
  3. echo preg_replace('/(?:(regular) (expressions)?)/','Group 1:"$1" Group 2: "$2", other text: ',$symbol_string);

Ами няма да възникне проблем, ако направим външна референция към несъществуваща група.

Това е едно от нещата, за които бях пропуснал да поговоря в предишните уроци,тъй като това повече зависи вече от самия програмен език и функциите боравещи с регулярни изрази.
« Последна редакция: 26 Август 2012, 22:12:07 от Stan »

georgirgeorgiev

  • Full Member
  • ***
  • Благодарности
  • -Казани: 77
  • -Получени: 13
  • Публикации: 164
Re: Допълнение към Регулярни изрази част 3
« Отговор #1 -: 25 Април 2015, 14:58:50 »
Благодаря ви за този урок. Бяха много полезни всичките уроци за регулярните изрази.