[ Vladica Savić @ 20.08.2011. 11:09 ] @
Pozdrav, imam ovakav input string:
Code:

Main {
 name 1 = value 1
 name 2 = value 2
}
Main {
 name 1 = value 1
 name 2 = value 2
sub {
name 1 = value 1
...
}
}

i ovakav regex (trenutno)
Code:

Main\s*?{(?<OptionsParams>[^}]+)}


Kako da moj regex uhvati sve sto je i u donjem delu "Main" tj. da poklopi pravilno "}" zagradu koju treba a ne prvu na koju naleti.
[ vujkev @ 20.08.2011. 12:03 ] @
u .net-u se to zove balancing expression, a mislim da je kod ostalih to nemoguće napraviti samo sa regex-om
[ Vladica Savić @ 20.08.2011. 12:15 ] @
To sam hteo da izbegnem da mesam .net i php.
[ Nikola Poša @ 20.08.2011. 20:33 ] @
Jes' da je funkcija token_get_all() po definiciji namenjena tokenizovanju nekog PHP kôda, ali mislim da bi ona ipak mogla da "proguta" taj tvoj snippet. Vidi onda šta možeš da izvučeš iz tog niza... Skoro sam siguran da bi onda mogla da se odradi ta neka simulacija balansiranja grupa, koja postoji u C# jeziku, nešto tipa:
Code:
$tokens = token_get_all($string);

$match = array();
$buffer = '';
$openBraces = null;

foreach ($tokens as $token) {
    if (is_array($token)) {
        $type    = $token[0];
        $value   = $token[1];
        $lineNum = $token[2];
        
        if ($type === T_STRING) {
            $buffer .= $value;
        }
        
        if ($openBraces === 0) {
            $match[] = $buffer;
            $buffer = '';
        }
    } else {
        if ($token == '{' || $token == '}') {
            if (null === $openBraces) {
               $openBraces = 0; 
            }
            
            if ($token == '{') {
                $openBraces++;
            } else {
                $openBraces--;
            }
        }
    }
}

To sam pisao onako iz glave, ali valjda će ti dati neku ideju...
[ Nikola Poša @ 20.08.2011. 20:41 ] @
btw Sad sam probao, ipak to neće moći tako kao što sam ja zamislio. Taj string koji hoćeš da tokenizuješ mora da počinje sa "<?php" da bi ga ta funkcija uopšte rasparčala po tokenima kako valja, a to što kôd mora da bude PHP sintaksno ispravan je drugi, još veći problem.
[ maddog_srb @ 24.08.2011. 18:49 ] @
Code:

            string _formula = "~~~~~~~~~~~~~~~~~~"; //tvoj string
            string _newFormula = ""; //pomocna promenljiva 
            
            while (_formula.IndexOf("{") >= 0)
            {
                //Odredjujemo najdublje zagrade u stringu
                int levelOfBracket = 0;
                int indexOfOpenBracket = -1;
                int indexOfClosedBracket = -1;
                
                int currLevel = 0;
                int currLevelOfOpenBracket = -1;

                for (int i = 0; i < strlen(_formula); i++)
                {
                    if (_formula[i] == "{")
                    {
                        currLevel++;
                        currLevelOfOpenBracket = i;
                    }

                    if (_formula[i]== "}")
                    {
                        if (currLevel > levelOfBracket)
                        {
                            levelOfBracket = currLevel;
                            indexOfClosedBracket = i;
                            indexOfOpenBracket = currLevelOfOpenBracket;
                        }

                        currLevel--;
                    }
                }

                // secemo sve od pocetka do najdublje zagrade, obradjujemo podatke koji su u najdubljim zagradama, i lepimo ostatak...
        // i tako sve dok ima zagrada...
                _newFormula = substr(_formula, 0, indexOfOpenBracket);
                _newFormula += UradiNestoSaNajdubljimZagradama(substr(_formula, indexOfOpenBracket + 1, indexOfClosedBracket - indexOfOpenBracket - 1)));
                _newFormula += substr(_formula, indexOfClosedBracket + 1);

                _formula = _newFormula;
            }            



ideja je da se nadju najdublje zagrade prvo, isece sve izmedju njih, i odradi neka custom funkcija, i vrati rezultat umesto tog dela (ili se jednostavno odstrani taj deo posle custom funkcije). Ponovo se odradjuje isto, sve dok se ne dodje do kraja...

Nisam probao za tvoj konkretan primer, ali probaj, poenta je u ideji, sad koliko je dobra, necu da sudim, ali meni je odradila posao :)))
[ Vladica Savić @ 15.09.2011. 10:52 ] @
Sorry, tek sad videh da je neko ovde odgovarao :)

Nasao sam resenje ovde.

Code:

function parse_section($section, $input) {
    $re = '/^\s*' . $section .'\s*{\s*|}$/s';
    $input = preg_replace($re, '', $input);
    $re = '/\s*}\s*' . $section .'\s*{/s';
    return preg_split($re, $input);
}


// using example
$mainSections = parse_section('Main', $input);
print_r($mainSections);