Ҷузъҳои ғайринигоҳдории дар regex-и 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';
?>
Ҳар яке аз чунин зерсатрҳоро ёбед ва барои ҳар як зерсатри ёфташуда дар кармани аввал чизеро, ки пеш аз ҷудокунанда истодааст, ва дар кармани дуюм - чизеро, ки баъд аз ҷудокунанда истодааст, гузоред.