Files
bm/public_html/public/include/bbcode.inc.php
2025-09-24 13:26:28 +02:00

256 lines
7.5 KiB
PHP

<?php
# BBCode Parser
# Martin Lenzelbauer
# (c) 2006
#
# ersetzt folgenden BBCode:
#
# [f] [/f]
# [k] [/k]
# [liste] [punkt] {[punkt] ...} [/liste]
# [liste] [*] {[*] ...} [/liste]
# [url=url neu=ja/nein] [/url]
# wandelt BBCode und unformatierten Text in Html um
//-----------------------------
function BBCode2HTML($string){
//-----------------------------
//Html Entities
$string = htmlspecialchars($string);
$string = stripslashes($string);
$string = nl2br($string);
$string = str_replace("", "&bdquo;", $string);
$string = str_replace("", "&rdquo;", $string);
$string = str_replace("", "&rdquo;", $string);
$string = str_replace("&amp;#", "&#", $string);
//Fett
$string = str_replace("[f]","<strong>",$string);
$string = str_replace("[F]","<strong>",$string);
$string = str_replace("[/f]","</strong>",$string);
$string = str_replace("[/F]","</strong>",$string);
$string = str_replace("[fett]", "<strong>", $string);
$string = str_replace("[/fett]", "</strong>", $string);
//Kursiv
$string = str_replace("[k]","<em>",$string);
$string = str_replace("[K]","<em>",$string);
$string = str_replace("[/k]","</em>",$string);
$string = str_replace("[/K]","</em>",$string);
//Listen
$string = str_replace("[liste]","</p><ul class=\"list\">",$string);
$string = str_replace("[LISTE]","</p><ul class=\"list\">",$string);
$string = str_replace("[punkt]","</li><li>",$string);
$string = str_replace("[PUNKT]","</li><li>",$string);
$string = str_replace("[*]","</li><li>",$string);
$string = str_replace("[/liste]","</li></ul><p>",$string);
$string = str_replace("[/LISTE]","</li></ul><p>",$string);
$listStart = 0;
while($listStart = strpos($string,"<ul>",$listStart)){
$firstItem = strpos($string, "</li>", $listStart);
$string = substr_replace($string, "", $firstItem, 5);
$listEnd = strpos($string, "</ul>", $listStart) + 5;
$list = str_replace("<br />", "\n", substr($string, $listStart, $listEnd));
$string = substr_replace($string, $list, $listStart, $listEnd);
$listStart++; # change 2007-11-26
}
//Links
$lower = strtolower($string);
$urlClose = 0;
//öffnendes [url=
$urlOpen = strpos($lower,"[url=",$urlClose);
while($urlOpen !== false){
//Ende des öffnenden Tags ]
$innerText = strpos($lower,"]",$urlOpen)+1;
//schließender Tag [/url]
$urlClose = strpos($lower,"[/url]",$urlOpen);
//Ende der eigentlichen URL entweder bei Leerzeichen oder ]
$urlEnd = strpos($lower," ",$urlOpen);
//Indexprüfungen um Endlosschleifen bei Syntaxfehlern im BBcode zu verhindern
if($innerText == 1) $innerText = strlen($lower) - 1;
if($innerText < $urlEnd || $urlEnd == 0) $urlEnd = $innerText-1;
if(!$urlClose) $urlClose = strlen($lower) - 1;
//URL extrahieren
$url = substr($string,$urlOpen+5,$urlEnd-$urlOpen-5);
//Linktext extrahieren
$text = substr($string,$innerText,$urlClose-$innerText);
//Target ermitteln
$targetstr = substr($lower,$urlEnd,10);
if(strpos($targetstr,"nein") > 0){
$target = "_self";
}
else{
$target = "_blank";
}
//Ersetzen
$href = "<a href=\"$url\" target=\"$target\">$text</a>";
$string = substr_replace($string,$href,$urlOpen,$urlClose+6-$urlOpen);
$lower = strtolower($string);
$urlOpen = @strpos($lower,"[url=",$urlClose);
}
$string = checkTag($string,"strong");
$string = checkTag($string,"em");
return $string;
}
# wandelt BBCode in Plain Text um
//-----------------------------
function BBCode2PlainText($string){
//-----------------------------
//Fett
$string = str_replace("[f]","*",$string);
$string = str_replace("[F]","*",$string);
$string = str_replace("[/f]","*",$string);
$string = str_replace("[/F]","*",$string);
$string = str_replace("[fett]", "*", $string);
$string = str_replace("[/fett]", "*", $string);
//Kursiv
$string = str_replace("[k]","*",$string);
$string = str_replace("[K]","*",$string);
$string = str_replace("[/k]","*",$string);
$string = str_replace("[/K]","*",$string);
//Listen
$string = str_replace("[liste]","",$string);
$string = str_replace("[LISTE]","",$string);
$string = str_replace("[punkt]"," - ",$string);
$string = str_replace("[PUNKT]"," - ",$string);
$string = str_replace("[*]"," - ",$string);
$string = str_replace("[/liste]","",$string);
$string = str_replace("[/LISTE]","",$string);
//Links
$lower = strtolower($string);
$urlClose = 0;
//öffnendes [url=
$urlOpen = strpos($lower,"[url=",$urlClose);
while($urlOpen !== false){
//Ende des öffnenden Tags ]
$innerText = strpos($lower,"]",$urlOpen)+1;
//schließender Tag [/url]
$urlClose = strpos($lower,"[/url]",$urlOpen);
//Ende der eigentlichen URL entweder bei Leerzeichen oder ]
$urlEnd = strpos($lower," ",$urlOpen);
//Indexprüfungen um Endlosschleifen bei Syntaxfehlern im BBcode zu verhindern
if($innerText == 1) $innerText = strlen($lower) - 1;
if($innerText < $urlEnd || $urlEnd == 0) $urlEnd = $innerText-1;
if(!$urlClose) $urlClose = strlen($lower) - 1;
//URL extrahieren
$url = substr($string,$urlOpen+5,$urlEnd-$urlOpen-5);
//Linktext extrahieren
$text = substr($string,$innerText,$urlClose-$innerText);
//Target ermitteln
$targetstr = substr($lower,$urlEnd,10);
if(strpos($targetstr,"nein") > 0){
$target = "_self";
}
else{
$target = "_blank";
}
//Ersetzen
$href = $url;
$string = substr_replace($string,$href,$urlOpen,$urlClose+6-$urlOpen);
$lower = strtolower($string);
$urlOpen = @strpos($lower,"[url=",$urlClose);
}
return $string;
}
#wandelt Html Code in BBCode um
//--------------------------------
function HTML2BBCode($string){
//--------------------------------
$string = html_entity_decode($string);
$string = str_replace("<br>","",$string);
$string = str_replace("<br />","",$string);
$string = str_replace("<strong>","[fett]",$string);
$string = str_replace("</strong>","[/fett]",$string);
$string = str_replace("<em>","[kursiv]",$string);
$string = str_replace("</em>","[/kursiv]",$string);
$string = str_replace("<ul>","[liste]",$string);
$string = str_replace("</ul>","[/liste]",$string);
$string = str_replace("<li>","[*]",$string);
$string = str_replace("</li>","",$string);
$string = str_replace("\t"," ",$string);
$aClose = 0;
$aOpen = strpos($string,"<a href",$aClose);
$cnt = 0; //Endlosschleifern verhindern
while($aOpen !== false && $cnt < 100){
$aClose = strpos($string,"</a>",$aOpen);
if($aClose === false){
$aClose = strlen($string)-1;
}
//URL extrahieren
$urlStart = $aOpen+9;
$urlEnd = strpos($string,"\"",$urlStart+1);
$url = substr($string,$urlStart,$urlEnd-$urlStart);
//Text extrahieren
$textStart = strpos($string,">",$aOpen)+1;
$text = substr($string,$textStart,$aClose-$textStart);
//Target
$targetstr = substr($string,$urlEnd,20);
if(strpos($targetstr,"_blank") > 0){
$target = "ja";
}
else{
$target = "nein";
}
$url = "[url=$url neu=$target]".$text."[/url]";
$string = substr($string,0, $aOpen) . $url . substr($string, $aClose+4);
$aOpen = strpos($string,"<a href",$aOpen);
$cnt++;
}
return stripslashes($string);
}
#überprüft, ob Tags auch wieder geschlossen wurden
//-------------------------------
function checkTag($string,$tag){
//-------------------------------
if(strlen($string) < 2){
return $string;
}
$open = 0;
$close = 0;
$openCount = 0;
$closeCount = 0;
//öffnende und schließende Tags zählen
while($open = strpos($string,"<$tag>",$open+1)){
$openCount++;
if($close = strpos($string,"</$tag>",$close+1)){
$closeCount++;
}
}
//nicht geschlossene Tags schließen
if($closeCount < $openCount){
for($i=0; $i<=($openCount-$closeCount); $i++){
$string .= "</$tag>";
}
}
return $string;
}
?>