Non-Capturing Parentheses in PHP Regex

Заградите () имаат две функции - групирање на знаци и функција на фатње (карман). А што да правиме ако ни треба да групираме, но да не фаќаме во карман? За решавање на ваквиот проблем се направени специјални нефатливи загради (?: ) - тие групираат, но не фаќаат во карман.

Пример

Во следниот пример, првите загради ни се потребни за групирање, а вторите - за карман. Сепак, и едните и другите загради зачувуваат податоци во карман:

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

Како резултат, во нашите кармани ќе има следново:

php<?php
  var_dump($res[0]); // ќе испечати 'abab123'
  var_dump($res[1]); // ќе испечати 'ab'
  var_dump($res[2]); // ќе испечати '123'
?>

Пример

Ајде да ги направиме првите загради да групираат само, но да не фаќаат во карман:

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

Како резултат, во првиот карман ќе биде нашето число:

php<?php
  var_dump($res[1]); // ќе испечати '123'
?>

Практични задачи

Задание 1

Дадени се подстрингови, поделени на два дела со произволен број на парови $@:

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

Најдете го секој од таквите подстрингови и за секој најден подстринг ставете го во првиот карман она што стои пред разделувачот, а во вториот карман - она што стои после разделувачот.