Home | Registrieren | Einloggen | Suchen | Aktuelles


Forum » PHP & MySQL » Offene Tags aus String entfernen Antworten
Offene Tags aus String entfernen

Mostone
Pixelschubser


Beiträge: 21


Hallo,

ich habe einen String, aus dem ich momentan mit strip_tags($inStr, $allowedTags) fast alle HTML-Tags entferne. Formatierungen wie bold, kursiv u.ä. bleiben. Nun ist das Problem, dass in dem String auch nicht-geschlossene Tags verbleiben können und damit die Darstellung der restlichen Seite diese Formatierung übernimmt. Wie geht man mit sowas üblicherweise um oder gibt es irgendeine Möglichkeit zu prüfen, ob die HTML-Formatierung korrekt ist?

Danke für jede Hilfe

  Profil   Editieren   Zitieren

HoRnominatoR
Mausakrobat


Beiträge: 165


du koenntest die vorkommen offener tags zaehlen und dann ggf loeschen/auffuellen.

---
get OPERA for free

  Profil   E-Mail   Website   Editieren   Zitieren

subjective
Forenheld


Beiträge: 848


Es gibt für php auch eine HTMLTidy-Extension - sonst ist halt Handarbeit angesagt.

---
Weaverslave

  Profil   Website   Editieren   Zitieren

Mostone
Pixelschubser


Beiträge: 21


Eigentlich dachte ich, dass das Schliessen von Tags ziemlich häufig notwendig ist, wenn man vom User Input bekommt, der HTML-Formatierungen erlaubt. Im Netz gefunden hab ich folgende Methode, die für mich sehr gut funktioniert:

1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44:
// string CloseOpenTags(string string [, string beginChar [, stringEndChar [, string CloseChar]]]);
function closeOpenTags($str, $open = "<", $close = ">", $end = "/", $tokens = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
{
  $chars = array();
  for($i = 0; $i < strlen($tokens); $i++)
  {
    $chars[] = substr($tokens, $i, 1); }

    $openedTags = array();
    $closedTags = array();
    $tag = FALSE;
    $closeTag = FALSE;
    $tagName = "";

    for ($i = 0; $i < strlen($str); $i++)
     {
     	$char = substr($str, $i, 1);
        if($char == $open) { $tag      = TRUE; continue; }
        if($char == $end)  { $closeTag = TRUE; continue; }
        if($tag && in_array($char, $chars)) { $tagName .= $char; }
        else {
          if($closeTag) {
           if(isset($closedTags[$tagName])) { $closedTags[$tagName]++;   }
           else                             { $closedTags[$tagName] = 1; }
          }
          elseif($tag)
          {
            if(isset($openedTags[$tagName])) { $openedTags[$tagName]++;   }
            else                             { $openedTags[$tagName] = 1; }
          }
         $tag = FALSE; $closeTag = FALSE; $tagName = "";
        }
     }

     while(list($tag, $count) = each($openedTags))
     {
      $closedTags[$tag] = isset($closedTags[$tag]) ? $closedTags[$tag]:0;
      $count -= $closedTags[$tag];
      if($count < 1) continue;
      $str .= str_repeat($open.$end.$tag.$close, $count);
     }

  return $str;
}

  Profil   Editieren   Zitieren

subjective
Forenheld


Beiträge: 848


Nein es ist eigentlich eher selten. Entweder zeigt man dem Benutzer einen Fehler an - weil einfach zumachen ist wohl kaum richtig, man nutzt BBCode, welchen man ehh parsen muss oder man nutzt einen JS-basierenden Editor, welcher ehh alles schließt.

---
Weaverslave

  Profil   Website   Editieren   Zitieren
 

Antworten
Nach oben