PHP တွင် Regular Expression အတွင်း Capturing Groups များ

Capturing groups များအတွင်းရှိ အကြောင်းအရာများကို အစားထိုးမည့် စာသားတွင်သာမက regular expression အတွင်း၌လည်း ရယူအသုံးပြုနိုင်သည် - ကျွန်ုပ်တို့သည် တစ်ခုခုကို capturing group ထဲသို့ ထည့်ထားနိုင်ပြီး၊ ထို regular expression အတွင်း၌ပင် ထို capturing group ထဲရှိ အကြောင်းအရာကို ဤနေရာတွင် ရှိရမည်ဟု ညွှန်ပြနိုင်သည်။

Capturing groups များအတွင်းရှိ အကြောင်းအရာများကို ၎င်းတို့၏နံပါတ်များဖြင့် ရယူနိုင်ပြီး၊ ထိုနံပါတ်များရှေ့တွင် backslash တစ်ခု ရှိသည်။ ဥပမာအားဖြင့်၊ သုည Capturing group ကို ဤကဲ့သို့ ရယူနိုင်သည် - \0၊ ပထမ Capturing group ကို ဤကဲ့သို့ - \1၊ ဒုတိယ Capturing group ကို - \2 စသည်ဖြင့် ရယူနိုင်သည်။

အထက်တွင် ရေးသားထားသည်များအားလုံးသည် သင့်အတွက် ယခုအချိန်ထိ မှုန်ဝါးနေမည်ဟု ကျွန်ုပ် ယုံကြည်ပါသည်။ ဤအရာသည် အံ့သြစရာမဟုတ်ပါ၊ အဘယ့်ကြောင့်ဆိုသော် capturing groups များသည် regular expressions များ၏ အရှင်းလင်းဆုံးနေရာမဟုတ်သောကြောင့်ဖြစ်သည်။ ဥပမာများဖြင့် ရှင်းလင်းကြည့်ရအောင်။

ဥပမာ

ကျွန်ုပ်တို့၌ ဤကဲ့သို့သော စာသားတစ်ခု ရှိသည်ဆိုပါစို့-

php<?php
  $str = 'aa bb cd ef';
?>

ကျွန်ုပ်တို့သည် ထိုစာသားထဲမှ မည်သည့်အက္ခရာနှစ်လုံးမဆို နောက်ချိတ်ပါဝင်သည့် နေရာအားလုံးကို ရှာကြည့်ကြပါစို့။ ဤပြဿနာကို ဖြေရှင်းရန် မည်သည့်အက္ခရာကိုမဆို ရှာဖွေပြီး၊ ၎င်းကို capturing group ထဲသို့ ထည့်ကာ၊ ထို့နောက် နောက်ထပ်စာလုံးသည် ထို capturing group ထဲရှိ အကြောင်းအရာအတိုင်း ဟုတ်မဟုတ် စစ်ဆေးကြည့်မည်-

php<?php
  $res = preg_replace('#([a-z])\1#', '!', $str);
?>

ရလဒ်အနေဖြင့် အောက်ပါအတိုင်း variable ထဲသို့ ရေးသွင်းသွားမည်-

php'! ! cd ef'

ဥပမာ

ကျွန်ုပ်တို့၌ ဤကဲ့သို့သော စာသားတစ်ခု ရှိသည်ဆိုပါစို့-

php<?php
  $str = 'asxca buzxb csgd';
?>

ကျွန်ုပ်တို့သည် ထိုစာသားထဲမှ ပထမနှင့် နောက်ဆုံးအက္ခရာများ တူညီသော စကားလုံးအားလုံးကို ရှာကြည့်ကြပါစို့။ ဤပြဿနာကို ဖြေရှင်းရန် အောက်ပါ pattern ကို ရေးသားမည်- အက္ခရာတစ်လုံး၊ ထို့နောက် အက္ခရာတစ်လုံး (သို့မဟုတ်) ထို့ထက်ပို၍၊ ထို့နောက် ပထမအက္ခရာနှင့် တူညီသော အက္ခရာ-

php<?php
  $res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>

ရလဒ်အနေဖြင့် အောက်ပါအတိုင်း variable ထဲသို့ ရေးသွင်းသွားမည်-

php'! ! csgd'

ဥပမာ

\1 အစား \g1 ဟု ရေးသားနိုင်သည်-

php<?php
  $res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>

ဥပမာ

\g{1} ဟုလည်း ရေးသားနိုင်သည်-

php<?php
  $res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>

ဥပမာ

Curly braces များအတွင်း အနုတ်ဂဏန်းများကို ဖော်ပြနိုင်သည်။ ဤသို့ဆိုလျှင် capturing groups များကို နောက်ဆုံးမှ ရေတွက်သွားမည်-

php<?php
  $res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>

လက်တွေ့လေ့ကျင့်ခန်းများ

Задание 1

အောက်ပါ စာသားကို ပေးထားသည်-

php<?php
  $str = 'aaa bbb ccc xyz';
?>

တူညီသော အက္ခရာသုံးလုံး နောက်ချိတ်ပါဝင်သည့် substring အားလုံးကို ရှာပါ။

Задание 2

အောက်ပါ စာသားကို ပေးထားသည်-

php<?php
  $str = 'a aa aaa abab bbbb';
?>

တူညီသော အက္ခရာနှစ်လုံး (သို့မဟုတ်) ထို့ထက်ပို၍ နောက်ချိတ်ပါဝင်သည့် substring အားလုံးကို ရှာပါ။

Задание 3

အောက်ပါ စာသားကို ပေးထားသည်-

php<?php
  $str = 'aaa aaa bbb bbb ccc ddd';
?>

တူညီသော စကားလုံးနှစ်လုံး နောက်ချိတ်ပါဝင်သည့် substring အားလုံးကို ရှာပါ။