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:
und die Ausgabe soll so aussehen:
Allerdings zerreiße ich mir an irgendeiner unauffindbaren Stelle den String, so dass ich eher etwas in die Art bekomme:
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:
Ich hoffe, ihr könnt mir helfen, denn bei mir siehts im mom so aus:
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]" );
?>
PHP-Code:
<br /><hr />
<a href="http://www.beispiel.de" target="_blank">schau mal bei beispiel rein</a>
<br /><hr />
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 = strtolower( substr( $source, $first_start+1, $first_end-$first_start-1 ) );
// Anfang des schließenden Tags suchen
if( !( ( $last_start = strpos( strtolower( $source ), "[/".$tag."]",
$first_end ) ) === false ) ) {
// Ende des schließenden Tags suchen
$last_end = strpos( strtolower( $source ), "]", $last_start
);
// Inhalt des Tag ermitteln
$contents = strtolower(
substr( $source, $first_start + strlen( $tag ) + 2,
$last_start - $first_end - 1 ) );
}
else {
$last_start = $last_end = false;
$contents = '';
}
// im Tag nach = suchen. Wenn gefunden, dann ist dieses
Tag ein Zuweisungstag
if( !( ( $first_equal = strpos( $tag, "=", 0 ) )=== false ) ) {
// Typ: Zuweisungstag
$typ = 2;
$value = substr( $tag, $first_equal + 1 );
// tag=value in nur tag splitten
$tag = substr( $tag, 0, $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( $contents, true );
$source = substr_replace( $source, $replace,
$first_start, ( $last_end - $first_start + 1 ) );
// $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 + 1 ) );
}
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 + 1 ) );
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, 4 );
}
// kein bekanntes Tag
else {
$source = substr_replace( $source,
'<!-- kein bekanntes Tag '.$tag, $first_start, 4 );
}
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:
Kommentar