Non-Capturing Parentheses in PHP Regex
Заградите () имаат две функции -
групирање на знаци и функција на фатње (карман). А
што да правиме ако ни треба да групираме,
но да не фаќаме во карман?
За решавање на ваквиот проблем се направени специјални
нефатливи загради (?: )
- тие групираат, но не фаќаат во карман.
Пример
Во следниот пример, првите загради ни се потребни за групирање, а вторите - за карман. Сепак, и едните и другите загради зачувуваат податоци во карман:
<?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';
?>
Најдете го секој од таквите подстрингови и за секој најден подстринг ставете го во првиот карман она што стои пред разделувачот, а во вториот карман - она што стои после разделувачот.