PHP-də RegExp-də Qruplar (Kod Blokları)
Qrupların məzmunu yalnız əvəzetmə sətirində deyil, həm də regExp-in özündə əlçatandır: biz nə isə bir qrupa yerləşdirə bilərik, sonra isə birbaşa regExp-də deyə bilərik ki, burada həmin qrupun məzmunu olmalıdır.
Qrupların məzmunu onların nömrələri ilə əlçatandır,
onların qarşısında tərs çəpik işarəsi durur. Məsələn,
sıfırıncı qrup belə əlçatan olacaq: \0,
birinci qrup belə - \1, ikinci
- \2 və s.
Əminəm ki, yuxarıda yazılanlar sizə hələlik olduqca qaranlıq görünür. Təəccüblü deyil, çünki qruplar - regExp-in ən az anlaşılan yeridir. Gəlin nümunələr üzərində anlayaq.
Nümunə
Tutaq ki, bizim belə bir sətirimiz var:
<?php
$str = 'aa bb cd ef';
?>
Gəlin onda bir-birinin ardınca gələn iki eyni hərfi tapaq. Məsələni həll etmək üçün istənilən hərfi axtaracağıq, onu qrupa yerləşdirəcəyik, sonra isə növbəti simvolun həmin qrupun məzmunu olub-olmadığını yoxlayacağıq:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
Nəticədə dəyişənə aşağıdakı yazılacaq:
'! ! cd ef'
Nümunə
Tutaq ki, bizim belə bir sətirimiz var:
<?php
$str = 'asxca buzxb csgd';
?>
Gəlin onda birinci və sonuncu hərfləri eyni olan bütün sözləri tapaq. Məsələni həll etmək üçün aşağıdakı şablonu yazacağıq: hərf, sonra bir və ya daha çox hərf, və sonra birinci hərflə eyni olan hərf:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
Nəticədə dəyişənə aşağıdakı yazılacaq:
'! ! csgd'
Nümunə
\1 əvəzinə \g1 yazmaq olar:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Nümunə
Həmçinin \g{1} da yazmaq olar:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Nümunə
Qıvrım mötərizələrdə mənfi ədədlər də göstərilə bilər. Bu halda qruplar sondan sayılacaq:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Praktiki Tapşırıqlar
Sətir verilib:
<?php
$str = 'aaa bbb ccc xyz';
?>
Ard-arda üç eyni hərf olan bütün alt sətirləri tapın.
Sətir verilib:
<?php
$str = 'a aa aaa abab bbbb';
?>
Ard-arda iki və ya daha çox eyni hərf olan bütün alt sətirləri tapın.
Sətir verilib:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Ard-arda iki eyni söz olan bütün alt sətirləri tapın.