Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

RegEx za nested curly brackets

[es] :: PHP :: RegEx za nested curly brackets

[ Pregleda: 1861 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Vladica Savić
Software Developer
Toronto, Canada

Član broj: 26699
Poruke: 654



+5 Profil

icon RegEx za nested curly brackets20.08.2011. u 11:09 - pre 154 meseci
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.
 
Odgovor na temu

vujkev
Beograd

Član broj: 8072
Poruke: 1347
212.200.241.*



+104 Profil

icon Re: RegEx za nested curly brackets20.08.2011. u 12:03 - pre 154 meseci
u .net-u se to zove balancing expression, a mislim da je kod ostalih to nemoguće napraviti samo sa regex-om
Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

Vladica Savić
Software Developer
Toronto, Canada

Član broj: 26699
Poruke: 654



+5 Profil

icon Re: RegEx za nested curly brackets20.08.2011. u 12:15 - pre 154 meseci
To sam hteo da izbegnem da mesam .net i php.
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-11.sezampro.rs.



+33 Profil

icon Re: RegEx za nested curly brackets20.08.2011. u 20:33 - pre 154 meseci
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...
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-11.sezampro.rs.



+33 Profil

icon Re: RegEx za nested curly brackets20.08.2011. u 20:41 - pre 154 meseci
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.
 
Odgovor na temu

maddog_srb
Cacak

Član broj: 192945
Poruke: 129
*.pool.mediaWays.net.



+24 Profil

icon Re: RegEx za nested curly brackets24.08.2011. u 18:49 - pre 154 meseci
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 :)))
 
Odgovor na temu

Vladica Savić
Software Developer
Toronto, Canada

Član broj: 26699
Poruke: 654



+5 Profil

icon Re: RegEx za nested curly brackets15.09.2011. u 10:52 - pre 153 meseci
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);

 
Odgovor na temu

[es] :: PHP :: RegEx za nested curly brackets

[ Pregleda: 1861 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.