preg_replace html tags, Ausnahmen hinzufügen.

Joe

Erfahrenes Mitglied
Hallo Tutorials,

ich möchte aus einen Text(PN) HTML-Tags entfernen bis auf Zeilenumbrüche, Paragraphen <p> und Überschriften <h1> und <h2>.
Mein Suchpattern sieht bisher so aus:
PHP:
		function html2txt($document){
		$search = array('@<script[^>]*?>.*?</script>@si',  // Strip out javascript
					   '@<[\/\!]*?[^<>]*?>@si',            // Strip out HTML tags //////* Den Teil hier */////
					   '@<style[^>]*?>.*?</style>@siU',    // Strip style tags properly
					   '@<![\s\S]*?--[ \t\n\r]*>@',         // Strip multi-line comments including CDATA
					   '@/\\/@'
		);
		$text = preg_replace($search, '', $document);
		return $text;
		}
		$ThatText2=stripslashes(stripslashes($mypn->Nachricht));
		$ThatText1=html2txt($ThatText2);
PHP:
 '@<[\/\!]*?[^<>]*?>@si'

Ja also ganz ehrlich, bei PCRE-Funktionen/Suchmustern habe ich richtig Probleme die Syntax zu begreifen. Würde mich wirklich über eine schnelle Lösung freuen oder über hilfreiche Tipps.

Grüße Joe.
 
Habe ne kleine Klasse von BBCodes erstellt.
Für die HTML-Tags benutze ich vorerst striptags, mit preg_replace fummel ich da noch übermorgen drann.
Ich möchte ja bestimmte Tags erlauben wie <p> und <br> (brauche ich vom Script her wenn ich zb SystemPNs schicke).
Ich denke das sollte soweit sicher sein.
Wichtig ist (wie du offensichtlich erkannt hast) aus Sicherheitsgründen die meisten Dinge zu entschärfen.

Im Moment sieht das bei mir so aus:
PHP:
		$mypn=mysql_fetch_object($mypnsql);
		function bbc2html($tmpText){
		 /*[b]*/ $tmpText = preg_replace('#\[b\](.*)\[/b\]#isU', '<b>$1</span>', $tmpText);
		 /*[i]*/ $tmpText = preg_replace('#\[i\](.*)\[/i\]#isU', '<i>$1</span>', $tmpText);
		 /*[u]*/ $tmpText = preg_replace('#\[u\](.*)\[/u\]#isU', '<span style="text-decoration:underline">$1</span>', $tmpText);
		 /*[color]*/ $tmpText = preg_replace('#\[color=(.*)\](.*)\[\/color\]#isU', '<span style="color:$1;">$2</span>', $tmpText);
		 /*[size] */ $tmpText = preg_replace('#\[size=([0-9]{1,2})\](.*)\[\/size\]#isU', '<span style="font-size:$1px;">$2</span>', $tmpText);
		 /*[font] */ $tmpText = preg_replace('#\[font=(.*)\](.*)\[\/font\]#isU', '<span style="font-family:$1;">$2</span>', $tmpText);
		 /*[url]*/ $tmpText = preg_replace('#\[url=(.*)\](.*)\[\/url\]#isU', '<a href="$1">$2</a>', $tmpText);
		 /*[url]*/ $tmpText = preg_replace('#\[url\](.*)\[\/url\]#isU', '<a href="$1">$1</a>', $tmpText);
		 /*[img]*/ $tmpText = preg_replace('#\[img\](.*)\[\/img\]#isU', '<img src="$1" alt="Bild" />', $tmpText);
		 /*[center]*/ $tmpText = preg_replace('#\[center\](.*)\[\/center\]#isU', '<div style="text-align:center">$1</div>', $tmpText);
		 /*[right] */ $tmpText = preg_replace('#\[right\](.*)\[\/right\]#isU', '<div style="text-align:right">$1</div>', $tmpText);
		  return $tmpText;
		}
		function html2txt($document){
		$search = array('@<script[^>]*?>.*?</script>@si',  // Strip out javascript
					   '@<style[^>]*?>.*?</style>@siU',    // Strip style tags properly
		);
		$text = preg_replace($search, '', $document);
		return $text;
		}
		$ThatText2=stripslashes(stripslashes($mypn->Nachricht));
		$ThatText2=strip_tags($ThatText2, '<p><h1><h2><br>');
		$ThatText1=html2txt($ThatText2);
		$ThatText=bbc2html($ThatText1);

Ist alles naja doch recht fummlig aber ich denke das reicht vorerst fürs gröbste und um den User ein paar Formatierungen zu geben.
 
Nen bisschen unübersichtlich, schau mal hier: http://www.der-webdesigner.net/tutorials/php/260-bbcode-mit-regulaeren-ausdruecken-umwandeln

Die Funktion:
PHP:
<?php
 
function parse_bbcode($str)
{
  # HTML Zeichen maskieren
  $str = htmlentities($str);
 
  # Smilies
  $str = str_replace(':)', '<img src="smile.gif" />', $str);
  $str = str_replace(':lol:', '<img src="lol.gif" />', $str);
  $str = str_replace(':cool:', '<img src="cool.gif" />', $str);
  $str = str_replace(':thumb:', '<img src="mr_green.gif" />', $str);
  $str = str_replace(':eek:', '<img src="eek.gif" />', $str);
 
  # Formatierungen
  $str = preg_replace('#\[b\](.*)\[/b\]#isU', "<b>$1</b>", $str);
  $str = preg_replace('#\[i\](.*)\[/i\]#isU', "<i>$1</i>", $str);
  $str = preg_replace('#\[u\](.*)\[/u\]#isU', "<u>$1</u>", $str);
  $str = preg_replace('#\[color=(.*)\](.*)\[/color\]#isU', "<span style=\"color: $1\">$2</span>", $str);
  $str = preg_replace('#\[size=(8|10|12)\](.*)\[/size\]#isU', "<span style=\"font-size: $1 pt\">$2</span>", $str);
 
  # Links
  $str = preg_replace('#\[url\](.*)\[/url\]#isU', "<a href=\"$1\">$1</a>", $str);
  $str = preg_replace('#\[ url=(.*)\](.*)\[/url\]#isU', "<a href=\"$1\">$2</a>", $str);
 
  # Grafiken
  $str = preg_replace('#\[img\](.*)\[/img\]#isU', "<img src=\"$1\" alt=\"$1\" />", $str);
 
  # Zitate
  $str = preg_replace('#\[quote\](.*)\[/quote\]#isU', "<div class=\"zitat\">$1</div>", $str);
   
  # Quelltext
  $str = preg_replace('#\[code\](.*)\[/code\]#isU', "<div class=\"code\">$1</div>", $str);
 
  # Listen
  $str = preg_replace('#\[list\](.*)\[/list\]#isU', "<ul>$1</ul>", $str);
  $str = preg_replace('#\[list=(1|a)\](.*)\[/list\]#isU', "<ol type=\"$1\">$2</ol>", $str);
  $str = preg_replace("#\[*\](.*)\\r\\n#U", "<li>$1</li>", $str);
   
  return $str;
}
 
Ja stimmt sieht wesentlich besser aus und Smileys sind auch nicht unerheblich (hab ich bisher beiseite gelegt). Hatte die Seite gestern schon gelesen aber das war zu einen Zeitpunkt wo die BBCodes für mich noch Neuland waren :D

Doch das gefällt.

Ich habe nur gerade ein weiteres Prob gesehen. Mir ist nicht ganz klar wieso aber beim Anzeigen des Textes wurde die ganze Zeit kein Zeilenumbruch gemacht. Ändern konnte ich dies mit $ThatText=nl2br($ThatText1);
Das tut wies soll, nur leider zerpflückt es mir nun auch eine längere URL.
Aus

wird
https:encrypted-
tbn1.gstatic.com/images?q=tbn:ANd9GcSEKdjj2K4jeXLEGGZfR0tBbaYn_TGDgnCogQm0A6fOK8PljOed
Das Bild wird nicht mehr angezeigt, wie kommt das?
 
Ja durch ein falsch angewandtes stripslashes() stripshlashes macht nur Sinn nach einen Post oder Get und vor einen mysql_real_escape_string()
Naja ich habe die MAgicQuotes absichtlich angelassen um ein irgendwo vergessenes mysql_real_escape_string wenigstens ein bisschen abzufangen. Der Firefox kann diesen Fail-Link dennoch anzeigen darum fiel es zunächst nicht auf.

Ich habe es aber mittlerweile alles so abgeändert wie von dir vorgeschlagen. Wenn dir noch was auffällt immer raus damit :)
PHP:
		$mypn=mysql_fetch_object($mypnsql);
		
		function parse_bbcode($str)
		{
				$str = preg_replace('#\<p\>(.*)\</p\>#isU', "[p]$1[/p]", $str);
				$str = preg_replace('#\<h1\>(.*)\</h1\>#isU', "[h1]$1[/h1]", $str);
				$str = preg_replace('#\<h2\>(.*)\</h2\>#isU', "[h2]$1[/h2]", $str);
				
				
			  # HTML Zeichen maskieren
			  $str = strip_tags($str);
			 
			
			 
			  # Formatierungen
			  $str = preg_replace('#\[p\](.*)\[/p\]#isU', "<p>$1</p>", $str);
			  $str = preg_replace('#\[h1\](.*)\[/h1\]#isU', "<h1>$1</h1><p>", $str);
			  $str = preg_replace('#\[h2\](.*)\[/h2\]#isU', "<h2>$1</h2><p>", $str);
			  $str = preg_replace('#\[b\](.*)\[/b\]#isU', "<b>$1</b>", $str);
			  $str = preg_replace('#\[i\](.*)\[/i\]#isU', "<i>$1</i>", $str);
			  $str = preg_replace('#\[u\](.*)\[/u\]#isU', "<u>$1</u>", $str);
			  $str = preg_replace('#\[color=(.*)\](.*)\[/color\]#isU', "<span style=\"color: $1\">$2</span>", $str);
			  $str = preg_replace('#\[size=(80|100|120)\](.*)\[/size\]#isU', "<span style=\"font-size: $1%\">$2</span>", $str);
			 
			  # Links
			  $str = preg_replace('#\[url\](.*)\[/url\]#isU', "<a href=\"$1\">$1</a>", $str);
			  $str = preg_replace('#\[ url=(.*)\](.*)\[/url\]#isU', "<a href=\"$1\">$2</a>", $str);
			 
			  # Grafiken
			  $str = preg_replace('#\[img\](.*)\[/img\]#isU', "<img src=\"$1\" alt=\"$1\" />", $str);
			 
			  # Zitate
			  $str = preg_replace('#\[quote\](.*)\[/quote\]#isU', "<div class=\"zitat\">$1</div>", $str);
			   
			  # Quelltext
			  $str = preg_replace('#\[code\](.*)\[/code\]#isU', "<div class=\"code\">$1</div>", $str);
			 
			  # Listen
			  $str = preg_replace('#\[list\](.*)\[/list\]#isU', "<ul>$1</ul>", $str);
			  $str = preg_replace('#\[list=(1|a)\](.*)\[/list\]#isU', "<ol type=\"$1\">$2</ol>", $str);
			  $str = preg_replace("#\[*\](.*)\\r\\n#U", "<li>$1</li>", $str);
			 
			  # Smilies
			$str = str_replace(':)', '<img src="smile/smile.png" />', $str);
			$str = str_replace(':*', '<img src="smile/kiss.png" />', $str);
			$str = str_replace(':$', '<img src="smile/pouty.png" />', $str);
			$str = str_replace(':kissing:', '<img src="smile/kissing.png" />', $str);
			$str = str_replace(':(', '<img src="smile/sad.png" />', $str);
			$str = str_replace(':-[', '<img src="smile/blush.png" />', $str);
			$str = str_replace('=0', '<img src="smile/shocked.png" />', $str);
			$str = str_replace(']8-', '<img src="smile/devil.png" />', $str);
			$str = str_replace(';)', '<img src="smile/wink.png" />', $str);
			$str = str_replace(':angel:', '<img src="smile/angel.png" />', $str);
			$str = str_replace('8-)', '<img src="smile/cool.png" />', $str);
			$str = str_replace(':rose:', '<img src="smile/rose.png" />', $str);
			$str = str_replace(':P', '<img src="smile/tongue.png" />', $str);
			$str = str_replace(':X', '<img src="smile/stfu.png" />', $str);
			$str = str_replace(':music:', '<img src="smile/music.png" />', $str);
			$str = str_replace('@=', '<img src="smile/bomb.png" />', $str);
			$str = str_replace(':laughing:', '<img src="smile/laughing.png" />', $str);
			$str = str_replace(':wrong:', '<img src="smile/wrong.png" />', $str);
			$str = str_replace(':yawn:', '<img src="smile/yawn.png" />', $str);
			$str = str_replace(':thumbs up:', '<img src="smile/thumbsup.png" />', $str);
			$str = str_replace('(((', '<img src="smile/cry.png" />', $str);
			$str = str_replace(':angry:', '<img src="smile/angry.png" />', $str);
			$str = str_replace(':-!', '<img src="smile/sick.png" />', $str);
			$str = str_replace(':beer:', '<img src="smile/beer.png" />', $str);
			$str = str_replace(':kissed:', '<img src="smile/kissed.png" />', $str);
			$str = str_replace(':D', '<img src="smile/biggrin.png" />', $str);
			$str = str_replace(':stop:', '<img src="smile/stop.png" />', $str);
			$str = str_replace(':inlove:', '<img src="smile/inlove.png" />', $str);
			$str = str_replace('O_o', '<img src="smile/blink.png" />', $str);
			$str = str_replace(':-r', '<img src="smile/drool.png" />', $str);
			$str = str_replace(':getlost:', '<img src="smile/getlost.png" />', $str);
			$str = str_replace(':grin:', '<img src="smile/grin.png" />', $str);
			$str = str_replace('^^', '<img src="smile/happy.png" />', $str);
			$str = str_replace(':poo:', '<img src="smile/poo.png" />', $str);
			$str = str_replace(':rolleyes:', '<img src="smile/rolleyes.png" />', $str);
			$str = str_replace('O_O', '<img src="smile/shock.png" />', $str);
			$str = str_replace('=]', '<img src="smile/sideways.png" />', $str);
			$str = str_replace('-_-', '<img src="smile/sleep.png" />', $str);
			$str = str_replace(':-B', '<img src="smile/teeth.png" />', $str);
			$str = str_replace(':thumb down:', '<img src="smile/thumbdown.png" />', $str);
			$str = str_replace(':-S', '<img src="smile/wacko.png" />', $str);
			   
			  return $str;
		}
		
		
		$ThatText2 = str_replace("<br>", "\r",$ThatText2); // Umbrüche
		$ThatText=parse_bbcode($ThatText2);
		$ThatText=nl2br($ThatText);

Nun stelle ich mir die Frage wie man eine Toolbar für die BBCodes gestalten müsste. Da es ja sofort angewendet wird, also die Tags automatisch gesetzt werden nach einen Klick, nehme ich an dies geht über Javascript.
Der Code Tag scheint mir sinnlos oder muss man ihm CSS mitgeben? Dann frage ich mich wie ein CSS zu Zitaten aussehen könnte, noch dazu wie man verschachtelte Zitate macht.
 
Zuletzt bearbeitet:
Zurück