Edgar Ehritt: Fehlerhafte (nicht abgeschlossene) HTML Tags entfernen

Beitrag lesen

Hallo Christian,

function checktags($string, $index = 0) {

$opentagpos   = strpos($string,'<', $index);
$index       = $opentagpos + 1;

$closetag1pos = strpos($string,'</',$index);
$closetag2pos = strpos($string,'>',$closetag1pos);

  
bereits hier machst Du Dir unnötige Umstände. Es reicht aus, die erste und zweite Postion von '<' zu ermitteln und nur diese Teilzeichenkette zu betrachen:  
  
`$segment=substr($string,($p=strpos($string,'<')+1),strpos($string,'<',$p)-$p);`{:.language-php}  
  
In `$segment`{:.language-php} muss denn nur noch nach einem '>' gesucht werden.  
So würde man dann Teilzeichenkette für Teilzeichenkette abarbeiten, nur warum sollte man das tun? explode() nimmt einem diese Arbeit ganz komfortabel ab:  
  
~~~php
$array=explode('<',$string);  
  
foreach($array as $v)  
   if(strpos($v,'>')===false)  
      echo "fehlerhaften Tag gefunden in '$v'\n";
if($closetag1pos !== false and $closetag2pos !== false) {  
  $inneropentag = strpos($string, '<', $index);  
  if(($inneropentag < $closetag1pos)) {  
  	$array = checktags($string, $inneropentag);  
  	$closetag1pos = strpos($array[0],'</',$array[1]);  
  	$closetag2pos = strpos($array[0],'>',$closetag1pos);  
  	$inneropentag = strpos($array[0], '<', $array[1]);  
  	if($closetag1pos === false and $closetag2pos === false)  
  		return array(substr($array[0],$opentagpos-1),$opentagpos-1);  
  	elseif($inneropentag === false)  
  		return array($array[0]);  
  	else  
  		checktags($array[0],$inneropentag);
  
Bei Deinem String `'<a><b></b></a>'`{:.language-php} greift Deine erste Bedingung `($closetag1pos === false and $closetag2pos === false)`{:.language-php} nicht. Auch Deine zweite Bedingung `($inneropentag === false)`{:.language-php} greift nicht. Es wird also getan, was unter `else`{:.language-php} angegeben ist. Vermutlich muss es da `return checktags($array[0],$inneropentag);`{:.language-php} heißen. So jedenfalls wird nichts ausgegeben. Testausgaben, so z. B. mit `print_r(array($closetag1pos,$closetag2pos,$inneropentag));`{:.language-php}, vor den Bedingungen hätten Dir hier helfen können, den Flüchtigkeitsfehler zu finden.  
  
Aber wie geschrieben, halte ich Deine Ansatz für umständlich und auch nicht wirklich zielführend, wenn ich mir die Ausgabe mit dem eingefügten `return`{:.language-php} ansehe. Nutze lieber explode()!  
  
  
Gruß aus Berlin!  
eddi