fork download
  1. <?php
  2.  
  3. $re = '/(?:(?!^)\G|({msg))\s+\K(?:\w+|\[[^][]*])(?=[^}]*})/';
  4. $str = 'text {msg ru key} text text {msg key [m=1,p=1]} text {msg ru key [m=la la|p=1]} text';
  5. $results = [];
  6. $tmp = -1;
  7. preg_replace_callback($re, function($m) use (&$results, &$tmp) {
  8. if (!empty($m[1])) {
  9. array_push($results, array($m[0]));
  10. $tmp=$tmp+1;
  11. } else {
  12. $results[$tmp][] = $m[0];
  13. }
  14. }, $str);
  15. print_r($results);
Success #stdin #stdout 0.02s 23772KB
stdin
Standard input is empty
stdout
Array
(
    [0] => Array
        (
            [0] => ru
            [1] => key
        )

    [1] => Array
        (
            [0] => key
            [1] => [m=1,p=1]
        )

    [2] => Array
        (
            [0] => ru
            [1] => key
            [2] => [m=la la|p=1]
        )

)