Archief - PHP: code parser schrijven

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

passero

Legacy Member
Heeft iemand info over hoe ik een parser kan schrijven in php?

Ik ben bezig met aan webapplicatie te schrijven waarmee je templates kan aanmaken. OP basis van die templates zal hij dan bepaalde zaken gaan tonen op het scherm. een beetje zoals een cms.
Die templates zouden hun eigen syntax hebben die ik bepaald.
Nu is de vraag, hoe kan ik best die syntax laten interpreteren door PHP? bestaan daar patterns voor ofzo? Iemand die ervaring heeft met zo iets?

een simpel voorbeeldje zoals de [ CODE ] of [ PHP ] tags hier op het forum. die worden ook geïnterpreteerd... Het is nu niet voor een forum bedoeld en de syntax zou bij mij veel verder gaan dan dit.

den Acid Burn

Legacy Member
een eerste punt: ge zorgt best dat ge uw data uit een db haalt ipv alles hard te coden in uw parser.

ge maakt bv 3 tabellen: 1 voor uw bestanden, 1 voor parser header info ofzo en 1 voor parser detail info.

als ge dat goed ontwerpt moet ge uw parser bijna nooit meer aanpassen.

grtz

passero

Legacy Member
tabel bestanden? Zijn dat dan de templates die de user kan aanmaken?
wat bedoel je juist met parser header info en parser detail info?


ma hoe ga ik bijvoorbeeld het best te werk om bepaalde syntax te vinden om die dan te integreren?
De volledige template doorlopen en dan kijken waar er syntax zit en die interpreteren of hoe moet ik dat zien?

Breen

Legacy Member
ik zou zoizo kiezen voor een xml compatibele taal, of ge nu een bestaande kiest of niet. Zodat ge tenminste automatisch een structuur kunt laten opstellen (uw boom). Parsing van al die dingen naar html, lijkt mij dan niet al te moeilijk.

passero

Legacy Member
en als ik nu een uitbreiding op html wil schrijven met mijn eigen syntax erbij zoals dat ook in .net gebeurd :

<asp:textbox runat="server" id="txtTekstveld" />
Zo een tag wordt dan ook omgezet naar <input type="text".... door de engine van .net
Dit is dus eigenlijk wat ik nodig heb...

omfg

Legacy Member
via functies in php kan je dat..
je bedoelt om bv ubb codes te parsen?
preg_replace
eregi_replace
str_replace
enzo kan je daarvoor gebruiken

(als het toch dat is wat je bedoelt :unsure: )

passero

Legacy Member
het is meer dan een replace
stel dat ik zo iets schrijf in mijn template:

<news number="5" />

dan moet hij dir vervangen door bijvoorbeeld 5 elementen die uit een DB of xml komen ofzo.
Er zit dus meer logic achter dan juist replace.

Kheos

Legacy Member
waarom maakt ge het uzelf dan nie makkelijker en schrijft uw templates in xml?
eenvoudig te parsen, ge kunt er later alle kanten mee op(integreren in flash for instance), universeel, en dan kunt ge uw news number = "5" trukjes gebruiken

passero

Legacy Member
mja, daar zit iets in maar dan moet ik gewoon van html een XML versie maken...
Of moet ik gewoon een "extensie" op html gebruiken en mijn template parsen als XML, terwijl het html is en elke tag die specifiek voor mijn template is, interpreteren, of zou dit niet goed zijn?
Het nadeel (soms ook voordeel...) is dan wel dat de html die je in de template moet schrijven valid moet zijn volgens XML, dus eigenlijk XHTML...
Zou dat niet ten nadele zijn van de user?

dJeez

Legacy Member
Zoek eens naar informatie over XSLT, misschien ligt de oplossing die je zoekt daar wel in.

passero

Legacy Member
neen want in XSLT's kan in toch geen php functies uitvoeren :s
Het is niet gewoon van A => B maar om A => B te gaan kan het zijn dat hij een hele hoop functies moet uitvoeren, records ophalen, loops, controle's,...

servi

Legacy Member
Er is geen functie create_code_parser()

Het enige wat je kan doen is gebruik maken van preg_replace, str_replace, str_match() , ....

Hetgeen wat jij eigenlijk wil schrijven is een mini-interpreter. Daar zijn echter niet echt standaardregels voor. Hetgeen je misschien eens kan doen is informatie opzoeken over hoe compilers werken, compilers worden immers met dezelfde problemen geconfronteerd.

Edit op je voorbeeld van <news number="5" /> geeft al aan hoe je het best niet doet, tags moeten immers universeel zijn :
een voorbeeldje :
<database table="news" count="5" />


PHP:
function parseFields ($data) {
    // read the XML database of fields
    $parser = xml_parser_create();
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($parser, $data, $values, $tags);
    xml_parser_free($parser);
    $fields = null;

    // doorloop de structuur
    foreach( $tags as $tagNaam => $waarde ) {
         if ( $tagNaam == "database" ) {
            // er kunnen meerdere <database>-tags zijn
            for ( $i=0; $i < $tags[$tagNaam]; $i++) {
                $attributen = $tags[$tagNaam[$i]]['attributes'];
                $waarde = $tags[$tagNaam[$i]];
                $dbTabel = $tags[$attributen['table']];
                $aantal = $tags[$attributen['count']];
                
                // haal gegevens uit de db
                $query = mysql_query('SELECT * FROM '.$dbTabel.' LIMIT '.$count);
                $uitvoer = '';
                while ( $rij = mysql_fetch_row($query) )
                    $uitvoer .= $rij['id'] .' :: ' . $rij['titel'];
                
                // we moeten nog <database ... /> vervangen door wat hier de uitvoer is
                
                $j = -1; // we moeten de i-de keer zoeken dat dit voorkomt
                $startLocatieString = -1; 
                while ( $j < $i ) {
                    $startLocatieString = strpos($data,"<database",$startLocatieString +1);
                    $j++;
                }
                // ok we hebben nu de startpositie gevonden, bepaal nu de eindpositie :
                $eindLocatieString = strpos($data,"/>",$startLocatieString + 1);

                // vervang nu de uitvoer
                $data  = substr($data,0,$startLocatieString) . $uitvoer . substr($data,$eindLocatieString);
                
            }
        } else if ( $tagNaam == "text" ) {
            // doe andere rommel
        }
    }
    return $data;
}

Met dit voorbeelje wordt er gegevens uit de database gehaald en in de pagina gestoken

Hier wordt dus <database table="news" count="5" /> vervangen door bijvoorbeeld :
1 :: Dit is een titel
2 :: Dit is titel 2
3 :: Dit is nog een titeltje
4 :: titel 4
5 :: Laatste titel


Maar zoals ge ziet is dit niet zo eenvoudig en blijft natuurlijk de vraag of het echt nodig is dat je je eigen taaltje moet construeren ( want dat is in weze wat je eigenlijk gaat doen )

Als ge echter nog nooit iets groot geprogrammeerd hebt of niet volledig reguliere expressies/xml verstaat raad ik u aan om er met uw fikken van af te blijven.

passero

Legacy Member
Dit is idd wat het zou kunnen zijn...

Zal er eens wat mee experimenteren :)

Kheos

Legacy Member
passero zei:
neen want in XSLT's kan in toch geen php functies uitvoeren :s
Het is niet gewoon van A => B maar om A => B te gaan kan het zijn dat hij een hele hoop functies moet uitvoeren, records ophalen, loops, controle's,...
nee, maar omgekeerd werkt wel, en dat heb ik ook gedaan

<? include ("../header/header.php")?>
<?
$x = xslt_create();
$result = xslt_process($x,
'file://'.getcwd()."/network.xml",
'file://'.getcwd().'/network.xsl');
if ($result) {
print $result;
} else {
print "XSLT error: ".xslt_error($x).", error code: ".xslt_errno($x);
}
xslt_free($x);
?>
<br/>
<a href="edithosts.php">Edit</a><br/>
<? include ("../footer/footer.php") ?>
dqn kunt ge dus wel php functies gebruiken( die includes for instance)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan