PHP регуляр ифодаларда сақланмайдиган қавслар
Қавслар () икки функцияни бажаради -
белгиларни гуруҳлаш ва карман функцияси. Аммо
агар биз гуруҳлашни хохласак, лекин карманга
қўйишни хохламасак нима қилиш керак?
Бундай муаммони ҳал қилиш учун махсус
сақланмайдиган қавслар (?: )
яратилган - улар гуруҳлайди, лекин карманга қўймайди.
Мисол
Қуйидаги мисолда биринчи қавслар бизга гуруҳлаш учун керак, иккинчилари эса карман учун. Аммо, ҳам биринчи, ҳам иккинчи қавслар маълумотларни карманга сақлайди:
<?php
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Натижада бизнинг карманларимизда қуйидагилар бўлади:
<?php
var_dump($res[0]); // чиқади 'abab123'
var_dump($res[1]); // чиқади 'ab'
var_dump($res[2]); // чиқади '123'
?>
Мисол
Биринчи қавслар фақат гуруҳлашни бажариши, аммо карманга қўйишни бажармаслиги учун қилайлик:
<?php
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Натижада биринчи карманда бизнинг рақамимиз бўлади:
<?php
var_dump($res[1]); // чиқади '123'
?>
Амалий вазифалар
Берилган подсатирлар ихтиёрий миқдордаги $@ жуфтлари
билан икки қисмга бўлинган:
<?php
$str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>
Ҳар бир бундай подсатирни топинг ва ҳар бир топилган подсатир учун биринчи карманга ажраткичдан олдин турувчи нарсани, иккинчи карманга эса ажраткичдан кейин турувчи нарсани қўйинг.