256 lines
7.5 KiB
PHP
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("„", "„", $string);
|
|
$string = str_replace("”", "”", $string);
|
|
$string = str_replace("“", "”", $string);
|
|
$string = str_replace("&#", "&#", $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;
|
|
}
|
|
|
|
|
|
|
|
?>
|