Tag-Syntax-Check

DataFox

Erfahrenes Mitglied
Hi Leute

Ich bastel grad an einem Texteingabefeld wo man diverse Codes zur Formatierung verwenden kann, damit der Output anschließend formatiert ist. z.B. wie hier die
Code:
(CODE) (/CODE)
Blöcke.

(ich weis, hier stehen sie in eckigen Klammern! musste so sein...)

Wenn man nun also so einen "Block" erstellt, wird ja später einfach nur (CODE) gegen z.b.
Code:
<span style="...">
getauscht, und (/CODE) gegen
Code:
</span>
.

Soooo einfach ist das dann aber doch net, weil es kann ja mal sein das jemand verigsst einen Block zu schließen!! Oder er macht mehr zu als auf (wäre weniger schlimm).

Gibt's da ne einfache Möglichkeit per RegExp sicher zu stellen das
A) nach einem öffnenden tag selbiges net nochmal geöffnet werden darf, es sei denn es wurde zuvor geschlossen

B) ein öffnendes tag unbedingt ein schließendes haben muss

C) es muss aber net unbedingt so ein tag vorkommen! kann auch sein das jemand nur text schreibt.

gibts für das Problem schon etwas entsprechendes? oder wie könnte man das anstellen?

Gruß
Laura
 
Mit regulären Ausdrücken ist das nicht möglich. Aber schau dir mal folgendes Thema an: [thread=275764]BBCODE hilfe[/thread].
 
Hi Gumbo

ich hab einen String der sieht z.b. so aus:

Code:
das ist ein string [ CODE ] hier code [ /CODE ] und hier text...

die leerzeichen muss man sich natürlich weg denken, ...

und:

Code:
	$openTags = array();
	$error = false;
	$parts = preg_split('/(\[.+?\])/s', $str, -1, PREG_SPLIT_DELIM_CAPTURE ^ PREG_SPLIT_NO_EMPTY);
	$return = array();
	while($part = array_shift($parts)) {
	    if( preg_match('@\[([a-zA-Z]+)\]@', $part, $match) ) {
	        $tagName = strtolower($match[1]);
	        $openTags[] = $tagName;
	        switch( $tagName ) {
	            case 'code':
	            	$return[] = '<div style="background-color:yellow;width:100%;"><div style="padding:10px;">';    
	                break;
	        }
	    } else if( preg_match('@\[/([a-zA-Z]+)\]@', $part, $match) ) {
	        $tagName = strtolower($match[1]);
	        if( ($lastOpenedTag = end($openTags)) && $lastOpenedTag !== $tagName ) {
	            $error = true;
	            echo 'Error: Die Eingabe ist fehlerhaft formatiert! Unerwartetes End-Tag "'.$tagName.'". Tippfehler? Guck nach.';
	            break;
	        }
	        array_pop($openTags);
	        switch( strtolower($tagName) ) {
	            case 'code':
	                $return[] = '</div></div>';
	                break;
	        }
	    } else {
	        $return[] = htmlspecialchars($part);
	    }
	}
	if( $error === false ) {
	    return join('', $return);
	}

wenn man alles richtig macht, also auf ein öffnendes tag immer brav ein schließendes, klappt es! wenn man nun aber z.b. 10 tags öffnet und keins schließt, kommt nicht wie erwartet die fehlermeldung...

in diesen Zeilen:
Code:
 } else if( preg_match('@\[/([a-zA-Z]+)\]@', $part, $match) ) {
	        $tagName = strtolower($match[1]);
	        if( ($lastOpenedTag = end($openTags)) && $lastOpenedTag !== $tagName ) {
	            $error = true;
	            echo 'Error: Die Eingabe ist fehlerhaft formatiert! Unerwartetes End-Tag "'.$tagName.'". Tippfehler? Guck nach.';
	            break;

hier wird geprüft ob sich das aktuell schließende tag auf das zuvor geöffnete bezieht...

hast Du eine Idee was da faul ist?

besten dank für Deine Hilfe!

Gruß
Laura
 
Zuletzt bearbeitet:
Hi,

ich denke, dazu müsstest Du nach dem Parsen noch überprüfen, ob das "tag-Stack"-Array $openTags leer ist. Wenn alle geöffneten Tags auch wieder geschlossen wurden, müsste es das sein. Wenn es nicht leer ist, könntest Du sogar mit einer foreach-Schleife drübergehen und alle nicht geschlossenen Tags auflisten lassen.

LG
 
Zurück