PHP ရှိ Regular Expression များတွင် Non-Capturing Parentheses များ

ကွင်းစကွင်းပိတ် () များသည် လုပ်ဆောင်ချက် နှစ်မျိုးရှိသည် - စာလုံးများအုပ်စုဖွဲ့ခြင်းနှင့် Capture Group ၏ လုပ်ဆောင်ချက်ဖြစ်သည်။ သို့သော် ကျွန်ုပ်တို့ အုပ်စုဖွဲ့လိုပြီး Capture Group ထဲသို့ မထည့်လိုပါက ဘာလုပ်ရမည်နည်း။ ထိုကဲ့သို့သော ပြဿနာများအတွက် ဖြေရှင်းနည်းအဖြစ် အထူး Non-Capturing Parentheses (?: ) များကို တီထွင်ထားသည် - ၎င်းတို့သည် အုပ်စုဖွဲ့ပေးသော်လည်း Capture Group ထဲသို့ မထည့်ပါ။

ဥပမာ

အောက်ပါ ဥပမာတွင် ပထမကွင်းများသည် အုပ်စုဖွဲ့ရန် လိုအပ်ပြီး၊ ဒုတိယကွင်းများသည် Capture Group အတွက် ဖြစ်သည်။ သို့သော် ကွင်းနှစ်မျိုးလုံးသည် အချက်အလက်များကို Capture Group ထဲသို့ သိမ်းဆည်းပေးသည်။

php<?php
  $str = 'abab123';
  $reg = '#(ab)+([1-9]+)#';
  preg_match_all($reg, $str, $res);
?>

ရလဒ်အနေဖြင့် ကျွန်ုပ်တို့၏ Capture Group များထဲတွင် အောက်ပါအတိုင်း ရှိလာမည်။

php<?php
  var_dump($res[0]); // 'abab123' ကို ဖော်ပြမည်
  var_dump($res[1]); // 'ab' ကို ဖော်ပြမည်
  var_dump($res[2]); // '123' ကို ဖော်ပြမည်
?>

ဥပမာ

ပထမ ကွင်းစုံသည် အုပ်စုဖွဲ့ရုံသာလုပ်ပြီး Capture Group ထဲသို့ မထည့်ရန် ပြုလုပ်ကြည့်ပါမည်။

php<?php
  $str = 'abab123';
  $reg = '#(?:ab)+([1-9]+)#';
  preg_match_all($reg, $str, $res);
?>

ရလဒ်အနေဖြင့် ပထမ Capture Group ထဲတွင် ကျွန်ုပ်တို့၏ ဂဏန်းများ ရှိလာမည်။

php<?php
  var_dump($res[1]); // '123' ကို ဖော်ပြမည်
?>

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

Задание 1

ပေးထားသော စာကြောင်းခွဲများကို $@ စုံဖြင့် ခွဲထားသော အပိုင်းနှစ်ပိုင်းအဖြစ် ခွဲထားသည်။

php<?php
  $str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>

ထိုကဲ့သို့သော စာကြောင်းခွဲတစ်ခုစီကို ရှာဖွေပြီး၊ တွေ့ရှိရသော စာကြောင်းခွဲတစ်ခုစီအတွက် ပထမ Capture Group ထဲတွင် ခွဲခြားသည့် စာလုံးအစုမတိုင်မီက စာလုံးများကို ထည့်ပါ။ ဒုတိယ Capture Group ထဲတွင် ခွဲခြားသည့် စာလုံးအစုပြီးနောက်က စာလုံးများကို ထည့်ပါ။