Text processor module | > Module written by Matt Mecham | +-------------------------------------------------------------------------- */ class post_parser { var $error = ""; var $image_count = 0; var $emoticon_count = 0; var $quote_html = array(); var $quote_open = 0; var $quote_closed = 0; var $quote_error = 0; var $emoticons = ""; var $badwords = ""; var $strip_quotes = ""; function smilie_length_sort($a, $b) { if ( strlen($a['typed']) == strlen($b['typed']) ) { return 0; } return ( strlen($a['typed']) > strlen($b['typed']) ) ? -1 : 1; } function word_length_sort($a, $b) { if ( strlen($a['type']) == strlen($b['type']) ) { return 0; } return ( strlen($a['type']) > strlen($b['type']) ) ? -1 : 1; } function post_parser($load=0) { global $ibforums, $DB; $this->strip_quotes = $ibforums->vars['strip_quotes']; if ($load != 0) { // Pre-load the bad words $DB->query("SELECT * from ibf_badwords"); if ( $DB->get_num_rows() ) { while ( $r = $DB->fetch_row() ) { $this->badwords[] = array( 'type' => stripslashes($r['type']), 'swop' => stripslashes($r['swop']), 'm_exact' => $r['m_exact'], ); } } // Pre-load the smilies $this->emoticons = array(); $DB->query("SELECT typed, image from ibf_emoticons"); if ( $DB->get_num_rows() ) { while ( $r = $DB->fetch_row() ) { $this->emoticons[] = array( 'typed' => stripslashes($r['typed']), 'image' => stripslashes($r['image']), 'clickable' => $r['clickable'], ); } } } } /**************************************************/ // PARSE POLL TAGS // Converts certain code tags for polling /**************************************************/ function parse_poll_tags($txt) { // if you want to parse more tags for polls, simply cut n' paste from the "convert" routine // anywhere here. $txt = preg_replace( "#\[img\](.+?)\[/img\]#ie" , "\$this->regex_check_image('\\1')", $txt ); $txt = preg_replace( "#\[url\](\S+?)\[/url\]#ie" , "\$this->regex_build_url(array('html' => '\\1', 'show' => '\\1'))", $txt ); $txt = preg_replace( "#\[url\s*=\s*\"\;\s*(\S+?)\s*\"\;\s*\](.*?)\[\/url\]#ie" , "\$this->regex_build_url(array('html' => '\\1', 'show' => '\\2'))", $txt ); $txt = preg_replace( "#\[url\s*=\s*(\S+?)\s*\](.*?)\[\/url\]#ie" , "\$this->regex_build_url(array('html' => '\\1', 'show' => '\\2'))", $txt ); return $txt; } /**************************************************/ // convert: // Parses raw text into smilies, HTML and iB CODE /**************************************************/ function convert($in=array( 'TEXT' => "", 'SMILIES' => 0, 'CODE' => 0, 'SIGNATURE' => 0, 'HTML' => 0)) { global $ibforums, $DB; $txt = $in['TEXT']; //-------------------------------------- // Returns any errors as $this->error //-------------------------------------- // Remove session id's from any post $txt = preg_replace( "#[?&;]s=([0-9a-zA-Z]){32}#", "", $txt ); //-------------------------------------- // convert
to \n //-------------------------------------- $txt = preg_replace( "/
|/", "\n", $txt ); //-------------------------------------- // Are we parsing iB_CODE and do we have either '[' or ']' in the // text we are processing? //-------------------------------------- if ( $in['CODE'] == 1 ) { //-------------------------------------- // Auto parse URLs //-------------------------------------- $txt = preg_replace( "#(^|\s)((http|https|news|ftp)://\w+\S+)#ie" , "\$this->regex_build_url(array('html' => '\\2', 'show' => '\\2', 'st' => '\\1'))", $txt ); //--------------------------------- // Do [CODE] tag //--------------------------------- $txt = preg_replace( "#\[code\](.+?)\[/code\]#ies", "\$this->regex_code_tag('\\1')", $txt ); //--------------------------------- // Do [QUOTE(name,date)] tags //--------------------------------- // Find the first, and last quote tag (greedy match)... $txt = preg_replace( "#(\[quote.*\].*\[/quote\])#ies" , "\$this->regex_parse_quotes('\\1')" , $txt ); /***********************************************/ // If we are not parsing a siggie, lets have a bash // at the [PHP] [SQL] and [HTML] tags. /***********************************************/ if ($in['SIGNATURE'] != 1) { $txt = preg_replace( "#\[sql\](.+?)\[/sql\]#ies" , "\$this->regex_sql_tag('\\1')" , $txt ); $txt = preg_replace( "#\[html\](.+?)\[/html\]#ies" , "\$this->regex_html_tag('\\1')" , $txt ); // [LIST] [*] [/LIST] //------------------------- $txt = preg_replace( "#\[list\]#i" , "", $txt ); } //--------------------------------- // Do [IMG] [FLASH] tags //--------------------------------- if ($ibforums->vars['allow_images']) { $txt = preg_replace( "#\[img\](.+?)\[/img\]#ie" , "\$this->regex_check_image('\\1')" , $txt ); $txt = preg_replace( "#(\[flash=)(\S+?)(\,)(\S+?)(\])(\S+?)(\[\/flash\])#ie", "\$this->regex_check_flash('\\2','\\4','\\6')", $txt ); } // Start off with the easy stuff $txt = preg_replace( "#\[b\](.+?)\[/b\]#is", "\\1", $txt ); $txt = preg_replace( "#\[i\](.+?)\[/i\]#is", "\\1", $txt ); $txt = preg_replace( "#\[u\](.+?)\[/u\]#is", "\\1", $txt ); $txt = preg_replace( "#\[s\](.+?)\[/s\]#is", "\\1", $txt ); // (c) (r) and (tm) $txt = preg_replace( "#\(c\)#i" , "©" , $txt ); $txt = preg_replace( "#\(tm\)#i" , "™" , $txt ); $txt = preg_replace( "#\(r\)#i" , "®" , $txt ); // font size, colour and font style // [font=courier]Text here[/font] [size=6]Text here[/size] [color=red]Text here[/color] while ( preg_match( "#\[size=([^\]]+)\](.+?)\[/size\]#ies", $txt ) ) { $txt = preg_replace( "#\[size=([^\]]+)\](.+?)\[/size\]#ies" , "\$this->regex_font_attr(array('s'=>'size','1'=>'\\1','2'=>'\\2'))", $txt ); } while ( preg_match( "#\[font=([^\]]+)\](.*?)\[/font\]#ies", $txt ) ) { $txt = preg_replace( "#\[font=([^\]]+)\](.*?)\[/font\]#ies" , "\$this->regex_font_attr(array('s'=>'font','1'=>'\\1','2'=>'\\2'))", $txt ); } while( preg_match( "#\[color=([^\]]+)\](.+?)\[/color\]#ies", $txt ) ) { $txt = preg_replace( "#\[color=([^\]]+)\](.+?)\[/color\]#ies" , "\$this->regex_font_attr(array('s'=>'col' ,'1'=>'\\1','2'=>'\\2'))", $txt ); } // email tags // [email]matt@index.com[/email] [email=matt@index.com]Email me[/email] $txt = preg_replace( "#\[email\](\S+?)\[/email\]#i" , "\\1", $txt ); $txt = preg_replace( "#\[email\s*=\s*\"\;([\.\w\-]+\@[\.\w\-]+\.[\.\w\-]+)\s*\"\;\s*\](.*?)\[\/email\]#i" , "\\2", $txt ); $txt = preg_replace( "#\[email\s*=\s*([\.\w\-]+\@[\.\w\-]+\.[\w\-]+)\s*\](.*?)\[\/email\]#i" , "\\2", $txt ); // url tags // [url]http://www.index.com[/url] [url=http://www.index.com]ibforums![/url] $txt = preg_replace( "#\[url\](\S+?)\[/url\]#ie" , "\$this->regex_build_url(array('html' => '\\1', 'show' => '\\1'))", $txt ); $txt = preg_replace( "#\[url\s*=\s*\"\;\s*(\S+?)\s*\"\;\s*\](.*?)\[\/url\]#ie" , "\$this->regex_build_url(array('html' => '\\1', 'show' => '\\2'))", $txt ); $txt = preg_replace( "#\[url\s*=\s*(\S+?)\s*\](.*?)\[\/url\]#ie" , "\$this->regex_build_url(array('html' => '\\1', 'show' => '\\2'))", $txt ); } // Swop \n back to
$txt = preg_replace( "/\n/", "
", $txt ); //+--------------------------------------------------------------------------------------------------- // Parse smilies (disallow smilies in siggies, or we'll have to query the DB for each post // and each signature when viewing a topic, not something that we really want to do. //+--------------------------------------------------------------------------------------------------- if ($in['SMILIES'] != 0 and $in['SIGNATURE'] == 0) { if ( ! is_array($this->emoticons) ) { $DB->query("SELECT typed, image from ibf_emoticons"); $this->emoticons = array(); if ( $DB->get_num_rows() ) { while ( $r = $DB->fetch_row() ) { $this->emoticons[] = array( 'typed' => stripslashes($r['typed']), 'image' => stripslashes($r['image']), 'clickable' => $r['clickable'], ); } } } usort($this->emoticons, array( 'post_parser', 'smilie_length_sort' ) ); if ( count($this->emoticons) > 0 ) { foreach($this->emoticons as $a_id => $row) { $code = $row['typed']; $image = $row['image']; /*$code = str_replace( "&", "&", $code ); $code = str_replace( "<", "<" , $code ); $code = str_replace( ">", ">" , $code ); $code = str_replace( "\"", """, $code); $code = str_replace( "'", "'" , $code); $code = str_replace( "!", "!" , $code); $code = str_replace( "|", "|" , $code);*/ // Make safe for regex $code = preg_quote($code, "/"); $txt = preg_replace( "!(?<=[^\w&])$code(?=.\W|\W.|\W$)!ei", "\$this->convert_emoticon('$code', '$image')", ' '.$txt.' ' ); } } if ($ibforums->vars['max_emos']) { if ($this->emoticon_count > $ibforums->vars['max_emos']) { $this->error = 'too_many_emoticons'; } } } $txt = $this->bad_words($txt); if ($in['HTML'] == 1) { $txt = str_replace( "<" ,"<" , $txt ); $txt = str_replace( ">" ,">" , $txt ); $txt = str_replace( """ ,"\"", $txt); $txt = str_replace( "'" ,"'" , $txt); $txt = str_replace( "&" ,"&" , $txt ); } return $txt; //trim($txt); } /**************************************************/ // Badwords: // Swops naughty, naugty words and stuff /**************************************************/ function bad_words($text = "") { global $DB, $ibforums; if ($text == "") { return ""; } //-------------------------------- if ( ! is_array($this->badwords) ) { $DB->query("SELECT * from ibf_badwords"); $this->badwords = array(); if ( $DB->get_num_rows() ) { while ( $r = $DB->fetch_row() ) { $this->badwords[] = array( 'type' => stripslashes($r['type']), 'swop' => stripslashes($r['swop']), 'm_exact' => $r['m_exact'], ); } } } usort($this->badwords, array( 'post_parser', 'word_length_sort' ) ); if ( count($this->badwords) > 0 ) { foreach($this->badwords as $idx => $r) { if ($r['swop'] == "") { $replace = '######'; } else { $replace = $r['swop']; } //--------------------------- $r['type'] = preg_quote($r['type'], "/"); //--------------------------- if ($r['m_exact'] == 1) { $text = preg_replace( "/(^|\b)".$r['type']."(\b|!|\?|\.|,|$)/i", "$replace", $text ); } else { $text = preg_replace( "/".$r['type']."/i", "$replace", $text ); } } } return $text; } /**************************************************/ // unconvert: // Parses the HTML back into plain text /**************************************************/ function unconvert($txt="", $code=1, $html=0) { if ($code == 1) { $txt = preg_replace( "#.+?#", "\\1" , $txt ); $txt = preg_replace( "#(.+?)(.+?)(.+?)#e" , "\$this->unconvert_sql(\"\\2\")", $txt); $txt = preg_replace( "#(.+?)(.+?)(.+?)#e", "\$this->unconvert_htm(\"\\2\")", $txt); $txt = preg_replace( "#.+?#e" , "\$this->unconvert_flash('\\1')", $txt ); $txt = preg_replace( "##" , "\[IMG\]\\1\[/IMG\]" , $txt ); $txt = preg_replace( "#(.+?)#" , "\[URL=\\1\\2\]\\3\[/URL\]" , $txt ); $txt = preg_replace( "#(.+?)#" , "\[EMAIL=\\1\]\\2\[/EMAIL\]" , $txt ); $txt = preg_replace( "#(.+?)#" , "\[i\]\\1\[/i\]" , $txt ); $txt = preg_replace( "#(.+?)#" , "\[b\]\\1\[/b\]" , $txt ); $txt = preg_replace( "#(.+?)#" , "\[s\]\\1\[/s\]" , $txt ); $txt = preg_replace( "#(.+?)#" , "\[u\]\\1\[/u\]" , $txt ); $txt = preg_replace( "##", "\[/LIST\]" , $txt ); $txt = preg_replace( "#(.+?)#e" , "\$this->unconvert_me('\\1', '\\2')", $txt ); $txt = preg_replace( "#(.+?)#e" , "\$this->unconvert_size('\\1', '\\2')", $txt ); $txt = preg_replace( "#(.+?)#" , "\[color=\\1\]\\2\[/color\]", $txt ); $txt = preg_replace( "#(.+?)#" , "\[font=\\1\]\\2\[/font\]" , $txt ); $txt = preg_replace( "#(.+?)#", '[CODE]' , $txt ); $txt = preg_replace( "#(.+?)#", '[/CODE]' , $txt ); $txt = preg_replace( "#(.+?)#" , '[QUOTE]' , $txt ); $txt = preg_replace( "#(.+?)#" , "[QUOTE=\\1,\\2]" , $txt ); $txt = preg_replace( "#(.+?)#" , '[/QUOTE]' , $txt ); // Tidy up the end quote stuff $txt = preg_replace( "#(\[/QUOTE\])\s*?
\s*#si", "\\1\n", $txt ); $txt = preg_replace( "##" , "" , $txt ); } if ($html == 1) { $txt = str_replace( "'", "'", $txt); } $txt = preg_replace( "#
#", "\n", $txt ); return trim(stripslashes($txt)); } //+----------------------------------------------------------------------------------------- //+----------------------------------------------------------------------------------------- // UNCONVERT FUNCTIONS //+----------------------------------------------------------------------------------------- //+----------------------------------------------------------------------------------------- function unconvert_size($size="", $text="") { $size -= 7; return '[SIZE='.$size.']'.$text.'[/SIZE]'; } function unconvert_flash($flash="") { $f_arr = explode( "+", $flash ); return '[FLASH='.$f_arr[0].','.$f_arr[1].']'.$f_arr[2].'[/FLASH]'; } function unconvert_me($name="", $text="") { $text = preg_replace( "#
(.+?)
#", "\\1" , $text ); $text = preg_replace( "#$name#", "", $text ); return '[ME='.$name.']'.$text.'[/ME]'; } function unconvert_sql($sql="") { $sql = stripslashes($sql); $sql = preg_replace( "#(.+?)#", "\\1", $sql ); $sql = preg_replace( "#\s*$#" , "", $sql ); return '[SQL]'.$sql.'[/SQL]'; } function unconvert_htm($html="") { $html = stripslashes($html); $html = preg_replace( "#(.+?)#", "\\1", $html ); $html = preg_replace( "#\s*$#" , "", $html ); return '[HTML]'.$html.'[/HTML]'; } //+----------------------------------------------------------------------------------------- //+----------------------------------------------------------------------------------------- // CONVERT FUNCTIONS //+----------------------------------------------------------------------------------------- //+----------------------------------------------------------------------------------------- /**************************************************/ // convert_emoticon: // replaces the text with the emoticon image /**************************************************/ function convert_emoticon($code="", $image="") { global $ibforums; if (!$code or !$image) return; // Remove slashes added by preg_quote $code = stripslashes($code); $this->emoticon_count++; return "$image"; } /**************************************************/ // wrap style: // code and quote table HTML generator /**************************************************/ function wrap_style( $in=array() ) { global $ibforums; if (! isset($in['TYPE']) ) $in['TYPE'] = 'class'; if (! isset($in['CSS']) ) $in['CSS'] = 'postcolor'; if (! isset($in['STYLE']) ) $in['STYLE'] = 'QUOTE'; //----------------------------- // This returns two array elements: // START: Contains the HTML code for the start wrapper // END : Contains the HTML code for the end wrapper //----------------------------- $possible_use = array( 'CODE' => array( 'CODE', 'CODE' ), 'QUOTE' => array( 'QUOTE', 'QUOTE' ), 'SQL' => array( 'CODE' , 'SQL'), 'HTML' => array( 'CODE' , 'HTML'), 'PHP' => array( 'CODE' , 'PHP') ); return array( 'START' => "
{$possible_use[$in[STYLE]][1]} {$in[EXTRA]}
", 'END' => "
" ); } /**************************************************/ // regex_html_tag: HTML syntax highlighting // /**************************************************/ function regex_html_tag($html="") { if ($html == "") return; // Ensure that spacing is preserved // Too many embedded code/quote/html/sql tags can crash Opera and Moz if (preg_match( "/\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\]/i", $html) ) { return $default; } //$html = preg_replace( "#\s{2}#", "  ", $html ); // Knock off any preceeding newlines (which have // since been converted into
) //$html = nl2br($html); $html = preg_replace( "/^
/", "", $html ); $html = preg_replace( "/^\s+/" , "", $html ); $html = preg_replace( "#<([^&<>]+)>#" , "<\\1>" , $html ); //Matches $html = preg_replace( "#<([^&<>]+)=#" , "<\\1=" , $html ); //Matches \\1
>" , $html ); //Matches $html = preg_replace( "!=("|')(.+?)("|')(\s|>)!" , "=\\1\\2\\3\\4" , $html ); //Matches ='this' $html = preg_replace( "!<!--(.+?)-->!" , "<!--\\1-->", $html ); $wrap = $this->wrap_style( array( 'STYLE' => 'HTML' ) ); return "{$wrap['START']}$html{$wrap['END']}"; } /**************************************************/ // regex_sql_tag: SQL syntax highlighting // /**************************************************/ function regex_sql_tag($sql="") { if ($sql == "") return; // Too many embedded code/quote/html/sql tags can crash Opera and Moz if (preg_match( "/\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\]/i", $sql) ) { return $default; } // Knock off any preceeding newlines (which have // since been converted into
) $sql = preg_replace( "/^
/", "", $sql ); $sql = preg_replace( "/^\s+/" , "", $sql ); // Make certain regex work.. if (! preg_match( "/\s+$/" , $sql) ) { $sql = $sql.' '; } $sql = preg_replace( "#(=|\+|\-|>|<|~|==|\!=|LIKE|NOT LIKE|REGEXP)#i" , "\\1", $sql ); $sql = preg_replace( "#(MAX|AVG|SUM|COUNT|MIN)\(#i" , "\\1(" , $sql ); $sql = preg_replace( "!("|'|')(.+?)("|'|')!i" , "\\1\\2\\3" , $sql ); $sql = preg_replace( "#\s{1,}(AND|OR)\s{1,}#i" , " \\1 " , $sql ); $sql = preg_replace( "#(WHERE|MODIFY|CHANGE|AS|DISTINCT|IN|ASC|DESC|ORDER BY)\s{1,}#i" , "\\1 " , $sql ); $sql = preg_replace( "#LIMIT\s*(\d+)\s*,\s*(\d+)#i" , "LIMIT \\1, \\2" , $sql ); $sql = preg_replace( "#(FROM|INTO)\s{1,}(\S+?)\s{1,}#i" , "\\1 \\2 ", $sql ); $sql = preg_replace( "#(SELECT|INSERT|UPDATE|DELETE|ALTER TABLE|DROP)#i" , "\\1" , $sql ); $html = $this->wrap_style( array( 'STYLE' => 'SQL' ) ); return "{$html['START']}{$sql}{$html['END']}"; } /**************************************************/ // regex_code_tag: Builds this code tag HTML // /**************************************************/ function regex_code_tag($txt="") { global $ibforums; $default = "\[code\]$txt\[/code\]"; if ($txt == "") return; // Too many embedded code/quote/html/sql tags can crash Opera and Moz if (preg_match( "/\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\]/i", $txt) ) { return $default; } // Take a stab at removing most of the common // smilie characters. $txt = preg_replace( "#<#" , "<", $txt ); $txt = preg_replace( "#>#" , ">", $txt ); $txt = preg_replace( "#"#" , """, $txt ); $txt = preg_replace( "#\s{1};#" , ";", $txt ); $txt = preg_replace( "#:#" , ":", $txt ); $txt = preg_replace( "#\[#" , "[", $txt ); $txt = preg_replace( "#\]#" , "]", $txt ); $txt = preg_replace( "#\)#" , ")", $txt ); $txt = preg_replace( "#\(#" , "(", $txt ); $txt = preg_replace( "#\r#" , "
", $txt ); $txt = preg_replace( "#\n#" , "
", $txt ); // Ensure that spacing is preserved $txt = preg_replace( "#\s{2}#", "  ", $txt ); $html = $this->wrap_style( array( 'STYLE' => 'CODE' ) ); return "{$html['START']}$txt{$html['END']}"; } /****************************************************************************************************/ // regex_parse_quotes: Builds this quote tag HTML // [QUOTE] .. [/QUOTE] - allows for embedded quotes /**************************************************/ function regex_parse_quotes($the_txt="") { if ($the_txt == "") return; $txt = $the_txt; // Too many embedded code/quote/html/sql tags can crash Opera and Moz /*if (preg_match( "/\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\].+?\[(quote|code|html|sql)\]/is", $txt) ) { $this->quote_error++; return $txt; }*/ $this->quote_html = $this->wrap_style( array( 'STYLE' => 'QUOTE' ) ); $txt = preg_replace( "#\[quote\]#ie" , "\$this->regex_simple_quote_tag()" , $txt ); $txt = preg_replace( "#\[quote=(.+?),\s*(.+?)\]#ie" , "\$this->regex_quote_tag('\\1', '\\2')" , $txt ); $txt = preg_replace( "#\[/quote\]#ie" , "\$this->regex_close_quote()" , $txt ); $txt = preg_replace( "/\n/", "
", $txt ); if ( ($this->quote_open == $this->quote_closed) and ($this->quote_error == 0) ) { // Preserve spacing $txt = preg_replace( "#(.+?)#es", "\$this->regex_preserve_spacing('\\1')", trim($txt) ); return $txt; } else { return $the_txt; } } /**************************************************/ // regex_preserve_spacing: keeps double spaces // without CSS killing
 tags
	/**************************************************/
	
	function regex_preserve_spacing($txt="") {
		$txt = preg_replace( "#\s{2}#", "  ", trim($txt) );
		return $txt;
	}
	
	/**************************************************/
	// regex_simple_quote_tag: Builds this quote tag HTML
	// [QUOTE] .. [/QUOTE]
	/**************************************************/
	
	function regex_simple_quote_tag() {
		global $ibforums;
		
		$this->quote_open++;

		return "{$this->quote_html['START']}";
		
	}
	
	/**************************************************/
	// regex_close_quote: closes a quote tag
	// 
	/**************************************************/
	
	function regex_close_quote() {
	
		if ($this->quote_open == 0) {
			$this->quote_error++;
		 	return;
		 }
		 
		 $this->quote_closed++;
		 
		 return "{$this->quote_html['END']}";
	}
	
	/**************************************************/
	// regex_quote_tag: Builds this quote tag HTML
	// [QUOTE=Matthew,14 February 2002]
	/**************************************************/
	
	function regex_quote_tag($name="", $date="") {
		global $ibforums;
		
		$default = "\[quote=$name,$date\]";
		
		$this->quote_open++;
		
		$html = $this->wrap_style( array( 'STYLE' => 'QUOTE', 'EXTRA' => "($name @ $date)" ) );
		
		$extra = "--$name+$date";
		
		return "{$html['START']}";
		
	}		
	
	/****************************************************************************************************/
	// regex_check_flash: Checks, and builds the 
	// html.
	/**************************************************/
	
	function regex_check_flash($width="", $height="", $url="") {
		global $ibforums;
		
		$default = "\[flash=$width,$height\]$url\[/flash\]";
		
		if (!$ibforums->vars['allow_flash']) {
			return $default;
		}
		
		if ($width > $ibforums->vars['max_w_flash']) {
			$this->error = 'flash_too_big';
			return $default;
		}
		
		if ($height > $ibforums->vars['max_h_flash']) {
			$this->error = 'flash_too_big';
			return $default;
		}
		
		if (!preg_match( "/^http:\/\/(\S+)\.swf$/i", $url) ) {
			$this->error = 'flash_url';
			return $default;
		}
		
		return "";
	}
	
	/**************************************************/
	// regex_check_image: Checks, and builds the 
	// html.
	/**************************************************/
	
	function regex_check_image($url="") {
		global $ibforums;
		
		if (!$url) return;
		
		$url = trim($url);
		
		$default = "[img]".$url."[/img]";
		
		++$this->image_count;
		
		// Make sure we've not overriden the set image # limit
		
		if ($ibforums->vars['max_images'])
		{
			if ($this->image_count > $ibforums->vars['max_images'])
			{
				$this->error = 'too_many_img';
				return $default;
			}
		}
		
		// Are they attempting to post a dynamic image, or JS?
		
		if ($ibforums->vars['allow_dynamic_img'] != 1)
		{
			if (preg_match( "/[?&;]/", $url))
			{
				$this->error = 'no_dynamic';
				return $default;
			}
			if (preg_match( "/javascript(\:|\s)/i", $url ))
			{
				$this->error = 'no_dynamic';
				return $default;
			}
		}
		
		// Is the img extension allowed to be posted?
		
		if ($ibforums->vars['img_ext'])
		{
			$extension = preg_replace( "/^.*\.(\S+)$/", "\\1", $url );
			$extension = strtolower($extension);
			$ibforums->vars['img_ext'] = strtolower($ibforums->vars['img_ext']);
			if (!preg_match( "/$extension(\||$)/", $ibforums->vars['img_ext'] ))
			{
				$this->error = 'invalid_ext';
				return $default;
			}
		}
		
		// Is it a legitimate image?
		
		if (!preg_match( "/^(http|https|ftp):\/\//i", $url )) {
			$this->error = 'no_dynamic';
			return $default;
		}
		
		// If we are still here....
		
		return "user posted image";
	}
		
	
    /**************************************************/
	// regex_font_attr:
	// Returns a string for an /e regexp based on the input
	/**************************************************/
	
	function regex_font_attr($IN) {
		if (!is_array($IN)) return "";
		
		// Trim out stoopid 1337 stuff
		// [color=black;font-size:500pt;border:orange 50in solid;]hehe[/color]
		
		if ( preg_match( "/;/", $IN['1'] ) )
		{
			$attr = explode( ";", $IN['1'] );
			
			$IN['1'] = $attr[0];
		}
		
		if ($IN['s'] == 'size')
		{
			$IN['1'] = $IN['1'] + 7;
			
			if ($IN['1'] > 30)
			{
				$IN['1'] = 30;
			}
			
			return "".$IN['2']."";
		}
		else if ($IN['s'] == 'col')
		{
			return "".$IN['2']."";
		}
		else if ($IN['s'] == 'font')
		{
			return "".$IN['2']."";
		}
	}
	
	/**************************************************/
	// regex_build_url: Checks, and builds the a href
	// html
	/**************************************************/
	
	function regex_build_url($url=array()) {
	
		$skip_it = 0;
		
		// Make sure the last character isn't punctuation.. if it is, remove it and add it to the
		// end array
		
		if ( preg_match( "/([\.,\?]|!)$/", $url['html'], $match) )
		{
			$url['end'] .= $match[1];
			$url['html'] = preg_replace( "/([\.,\?]|!)$/", "", $url['html'] );
			$url['show'] = preg_replace( "/([\.,\?]|!)$/", "", $url['show'] );
		}
		
		// Make sure it's not being used in a closing code/quote/html or sql block
		
		if (preg_match( "/\[\/(html|quote|code|sql)/i", $url['html']) )
		{
			return $url['html'];
		}
		
		// clean up the ampersands
		$url['html'] = preg_replace( "/&/" , "&" , $url['html'] );
		
		// Make sure we don't have a JS link
		$url['html'] = preg_replace( "/javascript:/i", "java script: ", $url['html'] );
		
		// Do we have http:// at the front?
		
		if ( ! preg_match("#^(http|news|https|ftp|aim)://#", $url['html'] ) )
		{
			$url['html'] = 'http://'.$url['html'];
		}
		
		//-------------------------
		// Tidy up the viewable URL
		//-------------------------

		if (preg_match( "/^".$show."" . $url['end'];
		
	}
	
}



?>