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;
} |