Christian_: Fehlerhafte (nicht abgeschlossene) HTML Tags entfernen

Beitrag lesen

Hallo,

auch wenn es eine umständlcieh Lösung ist, sie funktioniert:

  
// Der Index bestimmt die aktuelle Prüfposition im String  
function checktags($string, $index = 0) {  
	// Position des ersten Tags '<' Bestimmen  
	$opentagpos   = strpos($string,'<', $index);  
	  
	// Wenn ein öffnendes Tag vorhanden ist  
	if($opentagpos !== false) {  
		$index		  = $opentagpos + 1;  
		  
		// Position der ersten Schluss Tags '</' und '>' bestimmen  
		$closetag1pos = strpos($string,'</',$index);  
		$closetag2pos = strpos($string,'>',$closetag1pos);  
		  
		// Position des ersten selbstschließenden Schlusstags bestimmen  
		$selfclosetag = strpos($string,'/>',$index);  
		  
		// Wenn ein Schlusstag vorhanden ist  
		if($selfclosetag !== false or (($closetag1pos !== false) and ($closetag2pos !== false))) {  
			  
			// Position des nächsten offenen Tags '<' bestimmen  
			$inneropentag = strpos($string, '<', $index);  
			  
			// Abfrage nach erstem Schluss-Tag: '>' oder '/>'  
			if($selfclosetag !== false and $selfclosetag < $closetag2pos)  
				$firstclosedtag = $selfclosetag;  
			else // firstclosedtag wird auf das Erste schließende Tag gesetzt	  
				$firstclosedtag = $closetag2pos;  
			  
			  
			// Position des nächsten offenen Tags nach dem ersten schließenden Tag bestimmen  
			$nexttag	  = strpos($string,'<',$firstclosedtag);  
			  
			// Wenn das nächste offene Tag noch vor dem ersten schließenden Tag vorkommt. Bsp: <a><b></b></a> oder <a><img /></a>  
			//																					  ^					  ^	  
			if(($inneropentag < $closetag1pos and $firstclosedtag == $closetag2pos) or ($inneropentag < $selfclosetag and $firstclosedtag == $selfclosetag)) {  
				$array 		  = checktags($string, $inneropentag);		// Dann erst das verschachtelte offene Tag überprüfen -> Rekursiver Selbstaufruf  
				$closetag1pos = strpos($array[0],'</',$array[1]);		// Anschließend überprüfen ob das umfassende Tag geschlossen ist  
				$closetag2pos = strpos($array[0],'>',$closetag1pos);  
				$nexttag	  = strpos($array[0], '<',$closetag2pos);	// Position des nächsten Tags nach dem Schluss-Tag des umfassenden Tags bestimmen  
				  
				if($closetag1pos === false or $closetag2pos === false)	// Sollte das umfassende Tag nicht geschlossen sein wird der String ab der Position  
					if($opentagpos == 0)								// des umfassenden Tags gekürzt  
						return array('',0);  
					else  
						return array(substr($array[0],0,$opentagpos),$opentagpos-1);  
				elseif($nexttag !== false and $nexttag!== strpos($array[0],'</',$closetag2pos)) // Sollte ein weiteres Tag nach dem Schluss-Tag folgen  
					return checktags($array[0],$nexttag);										// wird es überprüft -> Rekursion	  
				else  
					return array($array[0], $closetag2pos);										// Sonst wird der String ausgegeben  
					  
			//	Sollte kein verschachteltes Tag vorkommen, wird überprüft ob nach dem ersten Schlusstag ein weiteres offenes Tag folgt	  
			} elseif($nexttag !== false and $nexttag !== strpos($string,'</',$firstclosedtag))  
				return checktags($string,$nexttag); 		// Falls ja, wird es überprft  
			  else  
			  	return array($string, $firstclosedtag+1);	// Sonst wird der String zürckgegeben  
  
		// Sollte es kein Schluss-Tag geben wird der String ab der Position des offenen Tags gelöscht.  
		} elseif($opentagpos == 0)  
			return array('',0);  
		  else  
			return array(substr($string,0,$opentagpos),$opentagpos-1);  
	// Wenn kein öffnendes Tag vorhanden ist -> String ausgeben ohne Änderung  
	} else  
		return array($string);  
}  

Ich hoffe es ist ausreichend kommentiert.

Gruß
Christian