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