PHP ရှိ Regular Expression များတွင် Non-Capturing Parentheses များ
ကွင်းစကွင်းပိတ် () များသည် လုပ်ဆောင်ချက် နှစ်မျိုးရှိသည် -
စာလုံးများအုပ်စုဖွဲ့ခြင်းနှင့် Capture Group ၏ လုပ်ဆောင်ချက်ဖြစ်သည်။
သို့သော် ကျွန်ုပ်တို့ အုပ်စုဖွဲ့လိုပြီး Capture Group ထဲသို့ မထည့်လိုပါက ဘာလုပ်ရမည်နည်း။
ထိုကဲ့သို့သော ပြဿနာများအတွက် ဖြေရှင်းနည်းအဖြစ် အထူး
Non-Capturing Parentheses (?: )
များကို တီထွင်ထားသည် - ၎င်းတို့သည် အုပ်စုဖွဲ့ပေးသော်လည်း Capture Group ထဲသို့ မထည့်ပါ။
ဥပမာ
အောက်ပါ ဥပမာတွင် ပထမကွင်းများသည် အုပ်စုဖွဲ့ရန် လိုအပ်ပြီး၊ ဒုတိယကွင်းများသည် Capture Group အတွက် ဖြစ်သည်။ သို့သော် ကွင်းနှစ်မျိုးလုံးသည် အချက်အလက်များကို Capture Group ထဲသို့ သိမ်းဆည်းပေးသည်။
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
ရလဒ်အနေဖြင့် ကျွန်ုပ်တို့၏ Capture Group များထဲတွင် အောက်ပါအတိုင်း ရှိလာမည်။
<?php
var_dump($res[0]); // 'abab123' ကို ဖော်ပြမည်
var_dump($res[1]); // 'ab' ကို ဖော်ပြမည်
var_dump($res[2]); // '123' ကို ဖော်ပြမည်
?>
ဥပမာ
ပထမ ကွင်းစုံသည် အုပ်စုဖွဲ့ရုံသာလုပ်ပြီး Capture Group ထဲသို့ မထည့်ရန် ပြုလုပ်ကြည့်ပါမည်။
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
ရလဒ်အနေဖြင့် ပထမ Capture Group ထဲတွင် ကျွန်ုပ်တို့၏ ဂဏန်းများ ရှိလာမည်။
<?php
var_dump($res[1]); // '123' ကို ဖော်ပြမည်
?>
လက်တွေ့လေ့ကျင့်ခန်းများ
ပေးထားသော စာကြောင်းခွဲများကို $@ စုံဖြင့် ခွဲထားသော အပိုင်းနှစ်ပိုင်းအဖြစ် ခွဲထားသည်။
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
ထိုကဲ့သို့သော စာကြောင်းခွဲတစ်ခုစီကို ရှာဖွေပြီး၊ တွေ့ရှိရသော စာကြောင်းခွဲတစ်ခုစီအတွက် ပထမ Capture Group ထဲတွင် ခွဲခြားသည့် စာလုံးအစုမတိုင်မီက စာလုံးများကို ထည့်ပါ။ ဒုတိယ Capture Group ထဲတွင် ခွဲခြားသည့် စာလုံးအစုပြီးနောက်က စာလုံးများကို ထည့်ပါ။