class GEDCOM
{
...
function GetLine()
{
$this->line="";
if(! feof( $this->fhandle) )
{
$this->line = trim( fgets( $this->fhandle, 1024) );
$this->line_no++;
}
return ( $this->line<>"" );
}
function GetLevel()
{
if( sscanf( $this->line, "%d", &$this->level) ==1)
{
return $this->level;
}else
{
if( $this->line<>"")
printf("Unknown level, line(%d):'%s'<br>\n", $this->line_no, $this->line);
return -1;
}
}
....
}
arnulf @
http://sa.no/slekt/
"Søren Hansen" <jes-s@mail1.stofanet.dk> wrote in message news:3d6cf6ae$0$699$ba624c82@nntp04.dk.telia.net...
> Jeg skal lave en parser til GEDCOM-filer (GEnealogical Data COMmunication).
>
> Standardens grammatiske opbygning er nøje beskrevet her:
>
http://www.gendex.com/gedcom55/55gcch1.htm
>
> Og her er nogle eksempler på en sådan fils opbygning:
>
http://www.genealogy.org/~ttw/lines/userguide/gedcom.html
>
> Jeg forestiller mig, at parseren skal hente ét tegn ad gangen fra en file
> pointer vha. fgetc(). Eksempelvis starter hver linie med en eller flere
> "digits". Disse tegn hente vha. følgende kode:
>
> function fun_level($chars) {
> global $fp;
> $char = fgetc($fp);
> if (ctype_digit($char)) fun_level($chars.$char);
> else return $chars;
> }
>
> $fp = fopen ("test.ged", "r");
> print fun_level("");
>
> Denne kode er bare lidt rodet dels fordi de enkelte klassificerede tegn skal
> returneres samlet og dels for det tegn som læses for meget i slutningen (det
> tegn som ikke længere er et "digit") skal gemmes til næste funktion.
>
> Er der en mere hensigtsmæssig måde at parse en sådan fil på?