Probleme mit Template-Klasse

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Probleme mit Template-Klasse

    Hi Leute,

    Ich sitze jetzt mehrere Stunden an einer Klasse, die verschiedene Templates wie z.B. ... auswerten und in vernünftigen html-code umwandeln soll.
    Im Grunde besteht diese Klasse nur aus einer einzigen Methode und könnte genausogut bloß eine Funktion sein, doch das ergänze ich Später noch weiter!

    Mein Problem ist jetzt, das ich nicht die Ausgaben erhalte, dich ich erwarte. Wahrscheinlich komm ich irgendwo mit meinen Positionszählern durcheinander.

    Also, folgendes:

    diese Zeichenfolge ist ein Beispiel dafür, wie die Eingabe in die Methode sein könnte:
    PHP-Code:
    <?php 
      
    echo $templates->replace"[hr][url=http://www.beispiel.de]
      schau mal bei beispiel rein[url][hr]" 
    ); 
    ?>
    und die Ausgabe soll so aussehen:
    PHP-Code:
    <br /><hr />
    <
    a href="http://www.beispiel.de" target="_blank">schau mal bei beispiel rein</a>
    <
    br /><hr /> 
    Allerdings zerreiße ich mir an irgendeiner unauffindbaren Stelle den String, so dass ich eher etwas in die Art bekomme:

    PHP-Code:
    <br /><hr />
    <
    a href="http://www.google.de" target="_blank"></a>gle rein-- kein bekanntes Tag url]
    <
    br /><hr /> 

    Zwischendurch funktionierten einige Ausgaben, nach einigen Änderungen, um die anderen Ausgaben auch zu korrigieren, änderten sich die Ausgaben wieder extremst!


    Vielleicht kann mir ja jemand helfen und findet einen Fehler oder gibt mir einen Neuen Denkansatz, so dass ich das ganze noch einmal überdenken kann!!

    Hier die Funktion:

    PHP-Code:
    <?php

    class templates {

    function 
    replace$source ) {
        
        
    // erstes Auftauchendes [
        
    $first_start 0;
        
    // erstes Auftauchendes =
        
    $first_equal 0;
        
    // erstes Auftauchendes ]
        
    $first_end   0;
        
        
    // Speichern die Start bzw. Endposition des schließenden [/...]
        
    $last_start 0;
        
    $last_end   0;
        
        
    // Speichert den Typ des aktuellen Tags
        //        0        Kein gültiger Typ
        //        1        einfaches Tag ( z.B. [IMG]...[/IMG] )
        //        2        Zuweisungstag ( z.B. [URL=...]...[/URL] )
        //        3        monadisches Tag ( z.B. [HR] )
        
    $typ 0;
        
        while ( !( ( 
    $first_start strpos$source"["$first_end ) )===false 
        ) {
            
            
    // Werte zurücksetzen
            
            // Wert in einem Zuweisungstag
            
    $value '';
            
    // Name des aktuellen Tags
               
    $tag '';
            
    // Inhalt des Tags
               
    $contents '';
               
               
            
    // nach erstem Vorkommen von ] suchen
            
    $first_end strpos$source"]"$first_start );
            
            
            
    // Namen des Tags ermitteln
            
    $tag strtolowersubstr$source$first_start+1$first_end-$first_start-) );
            
            
            
    // Anfang des schließenden Tags suchen
            
    if( !( ( $last_start strposstrtolower$source ), "[/".$tag."]",
     
    $first_end ) ) === false ) ) {
                
                
    // Ende des schließenden Tags suchen
                
    $last_end strposstrtolower$source ), "]"$last_start
     
    );
                
                
    // Inhalt des Tag ermitteln
                
    $contents strtolower
                    
    substr$source$first_start strlen$tag ) + 2
    $last_start $first_end ) );
            }
            else {
                
    $last_start $last_end false;
                
    $contents '';
            }
            
            
            
    // im Tag nach = suchen. Wenn gefunden, dann ist dieses 
    Tag ein Zuweisungstag
            
    if( !( ( $first_equal strpos$tag"=") )=== false ) ) {
                
    // Typ: Zuweisungstag
                
    $typ 2;
                
                
    $value substr$tag$first_equal );
                
                
    // tag=value in nur tag splitten
                
    $tag substr$tag0$first_equal );
            }
            
    // Kein Zuweisungsoperator. Überprüfen, ob ein 
    schließendes Tag gefunden wurde
             
    else if ( ( $last_end === false ) AND ( $last_start === false
     
    ) ) {
                
    // Typ:    monadisches Tag
                
    $typ 3;
            }
            
    // Kein = aber ein schließendes Tag gefunden
            
    else {
                
    // Typ:    einfaches Tag
                
    $typ 1;
            }
            
            
    // Je nach Typ verschieden behandeln
            
    switch( $typ ) {
                
                
    // einfaches Tag
                
    case 1:
                    
    // PHP
                    
    if( $tag == 'php' ) {
                        
                        
    // Syntaxhighlighting für PHP-Tags einstellen
                        
    $replace highlight_string$contentstrue );
                        
                        
    $source substr_replace$source$replace
    $first_start, ( $last_end $first_start ) );
                        
                        
    // $first_end korrigieren, um weiteres 
    Template-ersetzen innerhalb des Sourcecodes zu vermeiden
                        $first_end 
    $last_end;
                        
                    }
                    
                    
    // IMG
                    
    else if( $tag == 'img' ) {
                        
                        
    $replace '<img src="'.$contents.'" alt="ein 
    durch ein User eingebundenes Bild" />'
    ;
                        
                    }
                    
                    
    // ...
                    
                    // kein bekanntes Tag
                    
    else {
                        
                        
    $replace '<!-- Kein bekanntes Tag '.$tag.' -->';
                        
                    }
                    
                    
    // Tag ersetzen
                    
    if( $tag != 'php' ) {
                        
    $source substr_replace$source$replace
    $first_start, ( $last_end $first_start ) );
                    }
                    
                    break;
                
                
    // Zuweisungstag
                
    case 2:
                    
    // je nach Tag verschieden behandeln
                    
                    // URL
                    
    if( $tag == 'url' ) {
                        
                        
    $replace '<a href="'.$value.'" 
    target="_blank">'
    .$contents.'</a>';
                        
                    }
                    
                    
    // ...
                    
                    // kein bekanntes Tag
                    
    else {
                        
                        
    $replace '<!-- Kein bekanntes Tag '.$tag.' mit 
    Wert '
    .$value.' -->'.$contents;
                        
                    }
                    
                    
    // Tag ersetzen
                    
    $source substr_replace$source$replace
    $first_start, ( $last_end $first_start ) );
                    
                    break;
                
                
    // monadisches Tag
                
    case 3:
                    
    // je nach Tag verschieden behandeln
                    
                    // HR
                    
    if( $tag == 'hr' ) {
                        
    // Länge von [HR] = 4
                        
    $source substr_replace$source'<br /><hr />',
     
    $first_start);
                        
                    }
                    
                    
    // kein bekanntes Tag
                    
    else {
                        
                        
    $source substr_replace$source,
     
    '<!-- kein bekanntes Tag '.$tag$first_start);
                        
                    }
                    
                    break;
                
                
    // unbekanntes Tag
                
    default:
                    break;
                
            }    
    // ENDE switch
            
        
    }    // ENDE while
        
        
    return( $source );
    }
        
    };
        
    ?>

    Ich hoffe, ihr könnt mir helfen, denn bei mir siehts im mom so aus:

  • #2
    Hmm, mögt ihr mich nicht

    Im Moment überarbeite ich das ganze mit einem Stapel, allerdings scheint heute nicht mein Tag zu sein....

    Kommentar


    • #3
      es where schon, wenn du nur die relevante zeilen gesendet hättest, auser dem wenn du RegExpress benutzt hättest, dann würde deine code sich auf 5 zeilen reduzieren.
      Slava
      bituniverse.com

      Kommentar


      • #4
        du hast leider nicht genau beschrieben was gemacht wird.
        diese code durchzulesen habe ich leider kein bock gehabt, aber wenn du immer das gleiche ersetzt und nach dem prinzip da oben, kannst du das benutzen
        $pattern = '/\[hr\](<a href=\"([^\"]+)\"[^\[]+)\[url\]\[hr\]/is';
        $ersatz = '<br /><hr />$1</a><br /><hr />';
        echo preg_replace($pattern, $ersatz, $TXT);
        Slava
        bituniverse.com

        Kommentar


        • #5
          Ja, die preg_* -Funktionen hatte ich mir auch erst gedacht, doch diese lösung gefiel mir erlichgesagt besser! Ich habe gestern abend jedoch noch eine Lösung hinbekommen, in der ich zuerst nach dem öffnenden Tag suche, den Tagnamen extrahiere und dann nach einem Ende des Tags suche. Gibt es ein ende, extrahiere ich den Inhalt heraus und ersetze je nach Tag den Teil des Strings.
          Ist das Tag ohne Endtag, dann tritt eine einfache ersetzung in kraft, wie das [hr] zum beispiel
          Vorher wird der Stringteil vor dem Tag auf einen Stack gepackt und der ersetzte krams gleich dahinter. Dann geht die Schleife von vorne los.
          Abbruchbedingung ist, wenn keine Tags mehr gefunden werden
          Und alles ohne regex

          Das problem bei meinem oberen Beispiel ist, das sich die Position des Endtags ja ändert, wenn ich das Tag durch Inhalt ersetzte, ist mir jedoch beim größten nachgrübbeln nichtmal aufgefallen...

          Aber danke euch!

          Hier noch bissl code, falls jemand interesse dran hat. Sieht mehr aus als es ist, weil ich aufgrund der Lesbarkeit so viele Kommentare und Zeilenbrüche benutze:

          PHP-Code:
          function replace $source ) {
              
              
          // FIFO-Stack anlegen
              
          $fifo = new fifo;
              
              while( 
          $source != '' ) {
                  
                  
          // nach [ suchen
                  
          $first_start strpos$source'[');
                  
          // nach ] suchen
                  
          $first_end strpos$source']'$first_start );
                  
                  
          // öffnendes Tag gefunden
                  
          if( ( !( $first_start===false ) )
                      OR ( !( 
          $first_end===false ) ) ) {
                      
                      
          // Tag extrahieren
                      
          $tag substr$source$first_start 1,
                                
          $first_end $first_start );
                      
          // [/tag] suchen
                      
          $last strpos$source'[/'.$tag.']'$first_end );
                      
          // alles vor $first_start in fifo schreiben
                      
          $fifo->pushsubstr$source0$first_start ) );

                      
          // Schließendes Tag gefunden
                      
          if( !( $last === false ) ) {
                          
                          
          // Inhalt extrahieren
                          
          $contents substr$source,
                                        
          $first_end 1$last $first_end -);
                          
                          
          // Inhalt umwandeln
                          
          switch( strtolower$tag ) ) {
                              
                              
          // [quote]
                              
          case 'quote':
                                  
          $fifo->push(
                  
          '<br /><span id="quote">Zitat:<br />
                   <hr /><span id="quote">'
          .$contents.'</span>
                   <hr /></span>' 
          );
                                  break;
                              
                              
          // unbekanntes Tag
                              
          default:
                                  
          $fifo->push
                                                    
          '['.$tag.']'.$contents.'[/'.$tag.']' );
                                  break;
                          }
                      
                          
          // neue source bilden
                          
          $source substr$source,
                                        
          $last strlen'[/'.$tag.']' ) );
                          
                      }
                      
          // kein Schließendes Tag gefunden
                      
          else {
                          
                          
          // eventuell monadisches Tag
                          
          switch( $tag ) {
                              
          // [hr]
                              
          case 'hr':
                                  
          $fifo->push'<br /><hr />' );
                                  break;
                              
          // unbekanntes Tag
                              
          default:
                                  
          $fifo->push'['.$tag.']' );
                                  break;
                          }
                          
          // neue source bilden
                          
          $source substr$source$first_end );
                          
                      }
                  }
                  
          // kein öffnendes Tag mehr gefunden
                  
          else {
                      
          // Rest von source in fifo schreiben
                      
          $fifo->push$source );
                      
          // source löschen, um die Schleife zu beenden
                      
          $source '';
                  }
                  
              }    
          // ENDE while
              
              // String wieder zusammenbauen
              
          $result '';
              while( !
          $fifo->is_empty() ) {
                  
          $result .= $fifo->pop();
              }
              
              
          // Fertig extrahierten String zurückgeben
              
          return( $result );

          Kommentar


          • #6
            Original geschrieben von PHP-Desaster
            Ja, die preg_* -Funktionen hatte ich mir auch erst gedacht, doch diese lösung gefiel mir erlichgesagt besser!
            es gefehlt dir besser, weil du kein RegEx kannst!
            ich finde es aber gut, dass du aufgrund von vorhandenen Kenntnissen eine Lösung suchst und nicht aufgibst. Das ist genau mein Art zu programmieren.
            Schau bitte diesen link:
            http://www.regenechsen.de/phpwcms/index.php?regex_allg
            um regexpress zu verstehen.
            und
            http://www.cix88.de/projekte/regexp/
            um deine ausdrucke zu testen.
            Leider habe ich immer noch kein Lust in deine Code mich einarbeiten.
            Zuletzt geändert von Slava; 25.04.2006, 14:46.
            Slava
            bituniverse.com

            Kommentar

            Lädt...
            X