Avatar billede zephid_ Nybegynder
17. februar 2006 - 16:16 Der er 13 kommentarer og
1 løsning

Hvordan parser jeg dette?

Hey, jeg skal parse noget der ligner dette:

GuildInfo_GuildRoster = {
    ["Stormreaver"] = {
        ["Guild"] = {
            ["NumMembers"] = 112,
            ["Name"] = "Digital Dementia",
            ["MOTD"] = "...o0O LOVE BUG O0o... Everyone vote on the new poll (on forum) :)",
            ["Members"] = {
                ["Vasol"] = {
                    ["Zone"] = "Ironforge",
                    ["Group"] = "",
                    ["Class"] = "Druid",
                    ["Online"] = 0,
                    ["RankIndex"] = 7,
                    ["LastOnline"] = {
                        ["year"] = 0,
                        ["month"] = 0,
                        ["hour"] = 21,
                        ["day"] = 1,
                    },
                    ["Level"] = 60,
                    ["Name"] = "Vasol",
                    ["Rank"] = "Squire",
                },
            },
        },
    },
}

Der er 112 members i "Members" tagen, så hvordan får jeg nemmest fat i de forskellige data og putter dem i en SQL database? :)
Avatar billede pidgeot Nybegynder
17. februar 2006 - 17:51 #1
Den nemmeste måde er ved at læse teksten ind i en streng, bruge str_replace til at omdanne dit LUA-array til et PHP-array, og så køre eval:

  $from=Array('{','}','[',']','=','GuildInfo_GuildRoster => ');$to=Array('Array(',')','','','=>','$guildinfo=');
  $texttoparse=file_get_contents($_FILES['file']['tmp_name']);
  $texttoparse=str_replace($from,$to,$texttoparse) . ';';
  eval($texttoparse);

Efter kørslen af den kode har du så et array i PHP der hedder $guildinfo.

Det er dog ikke nogen særlig SIKKER metode, så hvis andre end dig kan uploade noget, vil jeg fraråde dig at bruge den metode, og i stedet analysere hver enkelt linie - du kan lave en funktion der kalder sig selv hver gang den møder et underarray, så kan du håndtere arrays af en virkårlig dybde.
Lige det har jeg dog ikke kode til endnu, men jeg står faktisk overfor at skulle i gang med netop den opgave til min egen WoW-addon - så hvis ingen andre har haft tid/mulighed skulle jeg gerne kunne give dig koden .
Avatar billede olebole Juniormester
17. februar 2006 - 18:18 #2
<ole>

Har du selv kontrol over serveren - eller har en bare lille smule visionær og kvik udbyder, der øjeblikkeligt installerer den - kan du bruge:
    http://pear.php.net/pepr/pepr-proposal-show.php?id=198

- eller hvis du er vandt til at compilere C, kan du bruge denne:
    http://www.aurore.net/projects/php-json/

Det er en ekstremt hurtig extension, der er bygget til det format, du viser: JSON (JavaScript Object Notation). Faktisk er den så hurtig, at den langt udkonkurer XML som datamedie til postbacks i XMLHttp-requests under AJAX-applikationer.

Personligt kunne jeg aldrig finde på at poste en AJAX forespørgsel tilbage i XML, da det fylder en del (og ofte en hel del) mere end JSON. Samtidig er JSON-formatet 'native' for JavaScript, så data ankommer til klienten i et format, der er direkte - og tudelet - anvendeligt i JavaScript  :)

/mvh
</bole>
Avatar billede olebole Juniormester
17. februar 2006 - 18:46 #3
- sorry ... her vrøvler jeg da vist. Din kode har jo intet med JSON at gøre - så bare glem indlægget  :)
Avatar billede pidgeot Nybegynder
17. februar 2006 - 18:52 #4
Jeg skal med glæde indrømme at JSON ikke er noget jeg har sat mig ret meget ind i, men ud fra det jeg lige kan finde er Lua-arrays ikke direkte kompatible med JSON, og en syntax-checker jeg fandt lader da også til at bekræfte dette (fejl på den første linie) - er du sikker på du er i det rigtige spørgsmål, Ole?
Avatar billede pidgeot Nybegynder
17. februar 2006 - 18:53 #5
Nå, så kan jeg lære at opdatere *G*
Avatar billede olebole Juniormester
17. februar 2006 - 19:18 #6
Hehe ... det så lige så hjemmevandt ud, da jeg først kastede et hurtigt blik på spm'et. Hvis du nu lærer at opdatere, skal jeg gøre et ihærdigt forsøg på at kikke ordentligt efter, inden jeg næste gang kaster mig ud i prosaens lysaligheder  ;D
Avatar billede olebole Juniormester
17. februar 2006 - 19:19 #7
'prosaens lyksaligheder'  :)
Avatar billede pidgeot Nybegynder
17. februar 2006 - 19:31 #8
Det er en aftale ^_~

I mellemtiden kan jeg da så lige glæde spørgeren med at jeg skulle mene at have en sikker parser til Lua-arrays:
<?PHP
function ReadArray(&$file)
{
    $arr=Array();
    $str=trim(fgets($file));
    while ($str!='}' && $str!='},')
    {
        $split=explode(' = ',$str);
        $split[0]=substr($split[0],2,-2);
        if ($split[1]=='{')
            $arr[$split[0]]=ReadArray($file);
        else
            $arr[$split[0]]=str_replace('"','',substr($split[1],0,-1));
        $str=trim(fgets($file));
    }
    return $arr;
}

    if (!empty($_FILES['file']['name']) && $_FILES['file']['error']==UPLOAD_ERR_OK)
    {
        $trigger='GuildInfo_GuildRoster';
        $file=fopen($_FILES['file']['tmp_name'], 'r');
        while (!feof($file)) {
            $str=fgets($file);
            if (substr($str,0,strlen($trigger))==$trigger)
            {
                $guildinfo=ReadArray($file);
            }
        }       
        fclose($file);
        //her bruger du så dit array
    }
?>

Det vigtige i denne er indholdet af $trigger - når scriptet finder en linie der starter med dette, går den igang med at indlæse array'et i $guildinfo. Alt der ikke fanges i dette vil blive sprunget over.

Vær dog opmærksom på at det kun er sikkert mod angreb indtil du skal have det ind i din SQL-database - sørg for at escape de data du sætter ind.
Avatar billede zephid_ Nybegynder
18. februar 2006 - 00:07 #9
Lyder sgu godt, og tak for svarene, tester det i morgen, så vender jeg tilbage :)
Avatar billede pidgeot Nybegynder
18. februar 2006 - 01:09 #10
Eftersom det gerne skulle virke for dig når min fil virker perfekt (og det trods alt også er WoW der har lavet filen der), tillader jeg mig at smide et svar nu - så slipper du for at vente på mig hvis det virker :)

Hvis det nu viser sig det IKKE virker efter planen - så kan du jo så selv bestemme om du vil afvise det med det samme eller vente til vi har fået det til at virke :)
Avatar billede pidgeot Nybegynder
22. februar 2006 - 18:57 #11
Er du nået længere med det her?
Avatar billede zephid_ Nybegynder
22. februar 2006 - 20:55 #12
Nej, desværre, har haft en del skole opgaver om ørene, så har ikke fået kigget mere på det, beklager. :\
Avatar billede pidgeot Nybegynder
22. februar 2006 - 21:05 #13
Fair, fair - ville bare sikre mig du ikke helt havde glemt det. :)
Avatar billede pidgeot Nybegynder
12. marts 2006 - 19:57 #14
Nu er der snart gået en måned - stadig ikke haft tid?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester