<?php
+/**
+ * html2bbcode
+ */
+
function html2bbcode($s) {
-// Tags to Find
-$htmltags = array(
- '/\<b\>(.*?)\<\/b\>/is',
- '/\<i\>(.*?)\<\/i\>/is',
- '/\<u\>(.*?)\<\/u\>/is',
- '/\<ul\>(.*?)\<\/ul\>/is',
- '/\<li\>(.*?)\<\/li\>/is',
- '/\<img(.*?) src=\"(.*?)\" (.*?)\>/is',
- '/\<div(.*?)\>(.*?)\<\/div\>/is',
- '/\<br(.*?)\>/is',
- '/\<strong\>(.*?)\<\/strong\>/is',
- '/\<a href=\"(.*?)\"(.*?)\>(.*?)\<\/a\>/is',
- '/\<code\>(.*?)\<\/code\>/is',
- '/\<font color=(.*?)\>(.*?)\<\/font\>',
- '/\<font color=\"(.*?)\"\>(.*?)\<\/font\>',
- '/\<blockquote\>(.*?)\<\/blockquote\>/is',
-
- );
-
-// Replace with
-$bbtags = array(
- '[b]$1[/b]',
- '[i]$1[/i]',
- '[u]$1[/u]',
- '[list]$1[/list]',
- '[*]$1',
- '[img]$2[/img]',
- '$2',
- '\n',
- '[b]$1[/b]',
- '[url=$1]$3[/url]',
- '[code]$1[/code],
- '[color="$1"]$2[/color]',
- '[color="$1"]$2[/color]',
- '[quote]$1[/quote]',
- );
-
-// Replace $htmltags in $text with $bbtags
-$text = preg_replace ($htmltags, $bbtags, $s);
-
-// Strip all other HTML tags
-$text = strip_tags($text);
-return $text;
-}
\ No newline at end of file
+ // only keep newlines from source that are within pre tags
+
+ $s = stripnl_exceptinpre($s);
+
+
+ // Tags to Find
+
+ $htmltags = array(
+ '/\<pre\>(.*?)\<\/pre\>/is',
+ '/\<p(.*?)\>/is',
+ '/\<\/p\>/is',
+ '/\<b\>(.*?)\<\/b\>/is',
+ '/\<i\>(.*?)\<\/i\>/is',
+ '/\<u\>(.*?)\<\/u\>/is',
+ '/\<ul\>(.*?)\<\/ul\>/is',
+ '/\<li\>(.*?)\<\/li\>/is',
+ '/\<img(.*?) src=\"(.*?)\" (.*?)\>/is',
+ '/\<div(.*?)\>(.*?)\<\/div\>/is',
+ '/\<br(.*?)\>/is',
+ '/\<strong\>(.*?)\<\/strong\>/is',
+ '/\<a (.*?)href=\"(.*?)\"(.*?)\>(.*?)\<\/a\>/is',
+ '/\<code\>(.*?)\<\/code\>/is',
+ '/\<span style=\"color:(.*?)\"\>(.*?)\<\/span\>/is',
+ '/\<span style=\"font-size:(.*?)\"\>(.*?)\<\/span\>/is',
+ '/\<blockquote\>(.*?)\<\/blockquote\>/is',
+ '/\<video(.*?) src=\"(.*?)\" (.*?)\>(.*?)\<\/video\>/is',
+ '/\<audio(.*?) src=\"(.*?)\" (.*?)\>(.*?)\<\/audio\>/is',
+
+ );
+
+ // Replace with
+
+ $bbtags = array(
+ '[code]$1[/code]',
+ '',
+ "\n",
+ '[b]$1[/b]',
+ '[i]$1[/i]',
+ '[u]$1[/u]',
+ '[list]$1[/list]',
+ '[*]$1',
+ '[img]$2[/img]',
+ '$2',
+ "\n",
+ '[b]$1[/b]',
+ '[url=$2]$4[/url]',
+ '[code]$1[/code]',
+ '[color="$1"]$2[/color]',
+ '[size=$1]$2[/size]',
+ '[quote]$1[/quote]',
+ '[video]$1[/video]',
+ '[audio]$1[/audio]',
+ );
+
+ // Replace $htmltags in $text with $bbtags
+ $text = preg_replace ($htmltags, $bbtags, $s);
+
+ call_hooks('html2bbcode', $text);
+
+ // Strip all other HTML tags
+ $text = strip_tags($text);
+ return $text;
+
+}
+
+function stripnl_exceptinpre($string)
+{
+ // First, check for <pre> tag
+ if(strpos($string, '<pre>') === false)
+ {
+ return str_replace("\n","", $string);
+ }
+
+ // If there is a <pre>, we have to split by line
+ // and manually replace the linebreaks
+
+ $strArr=explode("\n", $string);
+
+ $output="";
+ $preFound=false;
+
+ // Loop over each line
+ foreach($strArr as $line)
+ { // See if the line has a <pre>. If it does, set $preFound to true
+ if(strpos($line, "<pre>") !== false)
+ {
+ $preFound=true;
+ }
+ elseif(strpos($line, "</pre>") !== false)
+ {
+ $preFound=false;
+ }
+
+ // If we are in a pre tag, add line and also add \n, else add the line without \n
+ if($preFound)
+ {
+ $output .= $line . "\n";
+ }
+ else
+ {
+ $output .= $line ;
+ }
+ }
+
+ return $output;
+}
+