Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > Lazy Lexer in PHP
Antwort
 
Themen-Optionen
Alt 18.04.2007, 11:24   Nach oben    #1
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard Lazy Lexer in PHP

Morgen die Damen und Herren.

Ich suche nach gescheiten Ansätzen, Benutzereingaben in einer bestimmten
Auszeichnungssprache in einen XML-Baum zu konvetieren und dabei "fehlerhafte" bzw. unvollständige Eingaben zu korrigieren. Ich eine, das nannt sich dann "Lazy Lexer", oder?


Beipiel:
Code:
Dier hier **ist //ein** Testtext//.

Ein zweiter // Absatz.

Und noch// ein **Abatz
Gewünschte Ausgabe:
Code:
<p>Dies hier <strong>ist <em>ein </em></strong><em> Testtext</em>.</p>

<p>Ein zweiter <em> Absatz.</em></p>

<p><em>Und noch</em> ein <strong>Absatz</strong></p>
Ich denke, es wäre sinnig, den Text anhand von Schlüsselsymbolen in einer bestimmten Reihenfolge jeweils aufzusplitten und wieder zusammenzusetzen und jeweils bei jedem Teilstring prüfen, ob noch was offen ist und das dann zu schließen und im nächten Teilstring ggf. wieder zu öffnen.

Hier also erstmal die Absätze und z.B. beim zweiten Absatz erkennen: em wurde geöffnet, aber nicht geschlossen, also am Ende des Teilstrings schließen und beim nächsten dann gleich wieder öffnen.

Ich befürchte nur, dass die Regeln ziemlich komplex werden und ich damit nicht weit komme bzw. die einzelnen Element noch in bestimmte Klassen einordnen muss (wie Block- und Inline-Elemente), um den Wust handhaben zu können.

Jemand schonmal sowas gemacht und/oder Lust, seine Erfahrungen und Ideen zu teilen?

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.04.2007, 13:16   Nach oben    #2
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Mit PEAR::XML_HTMLSax hab ich jetzt schonmal einen guten Ansatz:

PHP-Code:
<?php

error_reporting
(E_ALL);

$sDoc = <<<EOD
Dies ist <b>fett <i foo="bar">und</b> kursiv</i>!
EOD;


require_once(
'XML/HTMLSax3.php');


class 
MyHandler {

    protected 
$sParsedString;
    protected 
$aTagStack;

    public function 
__construct()
    {
        
$this->sParsedString '';
        
$this->aTagStack = array();
    }

    public function 
openHandler($Parser$sName$aAttrs)
    {
        
$this->aTagStack[] = array('name' => $sName'attrs' => $aAttrs);
        
$sAttrs '';

        if (
count($aAttrs 0)) {

            foreach (
$aAttrs as $sAttr => $sValue) {

                
$sAttrs .= ' ' $sAttr '="' $sValue '"';
            }
        }
        
        
$this->sParsedString .= sprintf('<%s%s>'$sName$sAttrs);
    }

    public function 
closeHandler($Parser$sName)
    {
        
$aTempStack = array();

        while (
            !empty(
$this->aTagStack)
            && 
assert($aLastOpenTag end($this->aTagStack))
            && 
$aLastOpenTag['name'] !== $sName) {

            
$this->closeTag($aLastOpenTag['name']);
            
$aTempStack[] = $aLastOpenTag;
        }
        
$this->closeTag($sName);

        foreach (
$aTempStack as $aTag) {

            
$this->openHandler($Parser$aTag['name'], $aTag['attrs']);
        }
    }

    protected function 
closeTag($sName)
    {
        
array_pop($this->aTagStack);
        
$this->sParsedString .= "</$sName>";
    }

    public function 
dataHandler($Parser$sData)
    {
        
$this->sParsedString .= $sData;
    }

    function 
escapeHandler(& $parser,$data) {
        echo ( 
'Escape Handler: '.$data.'<br />' );
    }
    function 
piHandler(& $parser,$target,$data) {
        echo ( 
'PI Handler: '.$target.' - '.$data.'<br />' );
    }
    function 
jaspHandler(& $parser,$data) {
        echo ( 
'Jasp Handler: '.$data.'<br />' );
    }

    public function 
display()
    {
        echo 
'<pre>' htmlentities($this->sParsedString) . '</pre>';
    }
}

// Instantiate the handler
$Handler = new MyHandler();

// Instantiate the parser
$Parser = new XML_HTMLSax3();

// Register the handler with the parser
$Parser->set_object($Handler);

// Set a parser option
$Parser->set_option('XML_OPTION_TRIM_DATA_NODES');

// Set the handlers
$Parser->set_element_handler('openHandler','closeHandler');
$Parser->set_data_handler('dataHandler');
$Parser->set_escape_handler('escapeHandler');
$Parser->set_pi_handler('piHandler');
$Parser->set_jasp_handler('jaspHandler');

// Parse the document
$Parser->parse($sDoc);

$Handler->display();
Ausgabe:

Code:
Dies ist<b>fett<i foo="bar">und</i></b><i foo="bar">kursiv</i>!
Aber so ganz klar hab ichs noch nicht...

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.04.2007, 14:48   Nach oben    #3
axo
Gast
 
Beiträge: n/a
Standard

http://pear.php.net/Text_Wiki
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.04.2007, 11:48   Nach oben    #4
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Danke "axo".

Text_Wiki (1.2.0RC2) macht jedoch aus meinem Testtext folgendes:
Code:
<p>Dier hier <strong>ist <em>ein</strong> Testtext</em>.</p>

<p>Ein zweiter <em> Absatz.</p>

<p>Und noch</em> ein **Abatz</p>
Ich werde mir den Code aber mal genauer ansehen, vielleicht kann ich da was übernehmen.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.04.2007, 12:06   Nach oben    #5
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 789
Standard

Wenn ich meinen Code oben auf die Ausgabe von Text_Wiki anwende, dann gehts scheinbar ganz gut. Scheint sowas, wie ein XML-Beatuifier geworden zu sein (*Räusper*).

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP 5.2 Kompilierung schlägt fehl Byrel Tools, Server, Betriebssysteme 0 03.11.2006 21:09
[Rezension] PHP 5 Kochbuch Artemis Literatur 2 07.09.2006 19:15
PHP 5.1.5, PHP 4.4.4 und PHP 5.2.0 RC2 veröffentlicht Ben Nachrichten 2 01.09.2006 16:05
PHP 5.1 ist drausen robo47 Nachrichten 5 28.11.2005 20:30
Neue PHP "release candidates": PHP 4.4.2 RC 1 und PHP 5.1 RC 6 Ben Nachrichten 1 21.11.2005 20:48


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:48 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44