Current Path : /var/www/html/clients/rebirth.e-nk.ru/sources/lib/ |
Current File : /var/www/html/clients/rebirth.e-nk.ru/sources/lib/post_parser.php |
<?php /* +-------------------------------------------------------------------------- | Invision Power Board | ============================================= | by Matthew Mecham | (c) 2001 - 2006 Invision Power Services, Inc. | Nullified by Terabyte | ============================================= | | +--------------------------------------------------------------------------- | > $Date: 2006-09-22 06:28:54 -0400 (Fri, 22 Sep 2006) $ | > $Revision: 567 $ | > $Author: matt $ +--------------------------------------------------------------------------- | | > Text processor module | > Module written by Matt Mecham | > Official Version: 2.0 - Number of changes to date 3 billion (estimated) | > DBA Checked: Mon 24th May 2004 | +-------------------------------------------------------------------------- */ if ( ! defined( 'IN_IPB' ) ) { print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded 'admin.php'."; exit(); } 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 = ""; var $in_sig = ""; var $allow_unicode = 1; var $bypass_badwords = 0; var $load_custom_tags = 0; var $pp_do_html = 0; var $pp_nl2br = 1; var $pp_wordwrap = 0; var $max_embed_quotes = 10; /*-------------------------------------------------------------------------*/ // CONSTRUCTOR /*-------------------------------------------------------------------------*/ function post_parser($load=0) { $this->strip_quotes = $ibforums->vars['strip_quotes']; if ( $load ) { $this->check_caches($load); } } /*-------------------------------------------------------------------------*/ // CHECK (AND LOAD) CACHES /*-------------------------------------------------------------------------*/ function check_caches($load=0) { global $ibforums, $std, $DB; $load=0; if ( ! is_array( $ibforums->cache['emoticons'] ) ) { $ibforums->cache['emoticons'] = array(); $DB->simple_construct( array( 'select' => 'typed,image,clickable,emo_set', 'from' => 'emoticons' ) ); $DB->simple_exec(); while ( $r = $DB->fetch_row() ) { $ibforums->cache['emoticons'][] = $r; } usort( $ibforums->cache['emoticons'] , array( 'post_parser', 'smilie_length_sort' ) ); if ( $load ) { $std->update_cache( array( 'name' => 'emoticons', 'array' => 1, 'deletefirst' => 1 ) ); } } if ( ! is_array( $ibforums->cache['bbcode'] ) ) { $ibforums->cache['bbcode'] = array(); $DB->simple_construct( array( 'select' => 'bbcode_id, bbcode_tag, bbcode_replace, bbcode_useoption', 'from' => 'custom_bbcode' ) ); $bbcode = $DB->simple_exec(); while ( $r = $DB->fetch_row($bbcode) ) { $ibforums->cache['bbcode'][] = $r; } if ( $load ) { $std->update_cache( array( 'name' => 'bbcode', 'array' => 1, 'deletefirst' => 1 ) ); } } if ( ! is_array( $ibforums->cache['badwords'] ) ) { $ibforums->cache['badwords'] = array(); $DB->simple_construct( array( 'select' => 'type,swop,m_exact', 'from' => 'badwords' ) ); $bbcode = $DB->simple_exec(); while ( $r = $DB->fetch_row($bbcode) ) { $ibforums->cache['badwords'][] = $r; } usort( $ibforums->cache['emoticons'] , array( 'post_parser', 'word_length_sort' ) ); if ( $load ) { $std->update_cache( array( 'name' => 'badwords', 'array' => 1, 'deletefirst' => 1 ) ); } } } /*-------------------------------------------------------------------------*/ // Strip quote tags /*-------------------------------------------------------------------------*/ function strip_quote_tags( $txt="" ) { return preg_replace( "#\[QUOTE(=.+?,.+?)?\].+?\[/QUOTE\]#is", "", $txt ); } /*-------------------------------------------------------------------------*/ // strip all tags /*-------------------------------------------------------------------------*/ function strip_all_tags( $txt="" ) { $txt = $this->strip_quote_tags( $this->unconvert( $txt ) ); $txt = preg_replace( "#\[.+?\](.+?)\[/.+?\]#is", "\\1", $txt ); return $txt; } /*-------------------------------------------------------------------------*/ // strip all tags to formatted HTML /*-------------------------------------------------------------------------*/ function strip_all_tags_to_formatted( $txt="" ) { //$txt = $this->strip_quote_tags( $this->unconvert( $txt ) ); //$txt = preg_replace( "#\[CODE\](.+?)\[/CODE\]#is", "<pre>\\1</pre>", $txt ); //$txt = preg_replace( "#\[LIST\](.+?)\[/LIST\]#eis", "'<ul>' .str_replace( '[*]', '<li>', nl2br('\\1') ).'</ul>';", $txt ); //$txt = preg_replace( "#\[LIST=.+?\](.+?)\[/LIST\]#eis", "'<ul>' .str_replace( '[*]', '<li>', nl2br('\\1') ).'</ul>';", $txt ); //$txt = preg_replace( "#\[.+?\](.+?)\[/.+?\]#is", "\\1", $txt ); return $txt; } /*-------------------------------------------------------------------------*/ // 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; $this->check_caches(); $this->in_sig = $in['SIGNATURE']; $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}(&|;|&|$)?#e", "\$this->regex_bash_session('\\1', '\\3')", $txt ); //----------------------------------------- // convert <br> to \n //----------------------------------------- $txt = preg_replace( "/<br>|<br \/>/", "\n", $txt ); //----------------------------------------- // Are we parsing iB_CODE and do we have either '[' or ']' in the // text we are processing? //----------------------------------------- if ( $in['CODE'] == 1 ) { //----------------------------------------- // Do [CODE] tag //----------------------------------------- $txt = preg_replace( "#\[code\](.+?)\[/code\]#ies", "\$this->regex_code_tag( '\\1' )", $txt ); //----------------------------------------- // 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 [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] //----------------------------------------- while( preg_match( "#\n?\[list\](.+?)\[/list\]\n?#ies" , $txt ) ) { $txt = preg_replace( "#\n?\[list\](.+?)\[/list\]\n?#ies", "\$this->regex_list('\\1')" , $txt ); } while( preg_match( "#\n?\[list=(a|A|i|I|1)\](.+?)\[/list\]\n?#ies" , $txt ) ) { $txt = preg_replace( "#\n?\[list=(a|A|i|I|1)\](.+?)\[/list\]\n?#ies", "\$this->regex_list('\\2','\\1')" , $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", "<b>\\1</b>", $txt ); $txt = preg_replace( "#\[i\](.+?)\[/i\]#is", "<i>\\1</i>", $txt ); $txt = preg_replace( "#\[u\](.+?)\[/u\]#is", "<u>\\1</u>", $txt ); $txt = preg_replace( "#\[s\](.+?)\[/s\]#is", "<s>\\1</s>", $txt ); // (c) (r) and (tm) $txt = preg_replace( "#\(c\)#i" , "©" , $txt ); $txt = preg_replace( "#\(tm\)#i" , "™" , $txt ); $txt = preg_replace( "#\(r\)#i" , "®" , $txt ); // email tags // [email]matt@index.com[/email] [email=matt@index.com]Email me[/email] $txt = preg_replace( "#\[email\](\S+?)\[/email\]#i" , "<a href='mailto:\\1'>\\1</a>", $txt ); $txt = preg_replace( "#\[email\s*=\s*\"\;([\.\w\-]+\@[\.\w\-]+\.[\.\w\-]+)\s*\"\;\s*\](.*?)\[\/email\]#i" , "<a href='mailto:\\1'>\\2</a>", $txt ); $txt = preg_replace( "#\[email\s*=\s*([\.\w\-]+\@[\.\w\-]+\.[\w\-]+)\s*\](.*?)\[\/email\]#i" , "<a href='mailto:\\1'>\\2</a>", $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 ); // 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 ); } } // Swop \n back to <br> $txt = preg_replace( "/\n/", "<br />", $txt ); // Unicode? if ( $this->allow_unicode ) { $txt = preg_replace("/&#([0-9]+);/s", "&#\\1;", $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) { $txt = ' '.$txt.' '; usort( $ibforums->cache['emoticons'] , array( 'post_parser', 'smilie_length_sort' ) ); if ( count( $ibforums->cache['emoticons'] ) > 0 ) { foreach( $ibforums->cache['emoticons'] as $a_id => $row) { if ( $row['emo_set'] != $this->ipsclass->skin['_emodir'] ) { continue; } $code = $row['typed']; $image = $row['image']; //----------------------------------------- // Make safe for regex //----------------------------------------- $code = preg_quote($code, "/"); $txt = preg_replace( "!(?<=[^\w&;/])$code(?=.\W|\W.|\W$)!ei", "\$this->convert_emoticon('$code', '$image')", $txt ); } } $txt = trim($txt); if ( $ibforums->vars['max_emos'] ) { if ($this->emoticon_count > $ibforums->vars['max_emos']) { $this->error = 'too_many_emoticons'; } } } $txt = $this->bad_words($txt); $txt = $this->bbcode_check($txt); return $txt; } //----------------------------------------- // Checks opening and closing bbtags - doesn't parse at this point //----------------------------------------- function bbcode_check($t="") { global $ibforums, $DB, $std; $count = array(); foreach( $ibforums->cache['bbcode'] as $i => $r ) { if ( $r['bbcode_useoption'] ) { $count[ $r['bbcode_id'] ]['open'] = substr_count( strtolower($t), '['.strtolower($r['bbcode_tag']).'=' ); $count[ $r['bbcode_id'] ]['wrongopen'] = substr_count( strtolower($t), '['.strtolower($r['bbcode_tag']).']' ); } else { $count[ $r['bbcode_id'] ]['open'] = substr_count( strtolower($t), '['.strtolower($r['bbcode_tag']).']' ); $count[ $r['bbcode_id'] ]['wrongopen'] = substr_count( strtolower($t), '['.strtolower($r['bbcode_tag']).'=' ); } $count[ $r['bbcode_id'] ]['closed'] = substr_count( strtolower($t), '[/'.strtolower($r['bbcode_tag']).']' ); //----------------------------------------- // check... //----------------------------------------- if ( $count[ $r['bbcode_id'] ]['open'] != $count[ $r['bbcode_id'] ]['closed'] ) { if ( $count[ $r['bbcode_id'] ]['wrongopen'] == $count[ $r['bbcode_id'] ]['closed'] ) { $this->error = 'custom_tags_incorrect2'; } else { $this->error = 'custom_tags_incorrect'; } } } return $t; } //----------------------------------------- // My strip-tags. Converts HTML entities back before strippin' em //----------------------------------------- function my_strip_tags($t="") { $t = str_replace( '>', '>', $t ); $t = str_replace( '<', '<', $t ); $t = strip_tags($t); // Make sure nothing naughty is left... $t = str_replace( '<', '<', $t ); $t = str_replace( '>', '>', $t ); return $t; } //----------------------------------------- // Word wrap, wraps 'da word innit //----------------------------------------- function my_wordwrap($t="", $chrs=0, $replace="<br />") { if ( $t == "" ) { return $t; } if ( $chrs < 1 ) { return $t; } $t = preg_replace("#([^\s<>'\"/\.\\-\?&\n\r\%]{".$chrs."})#i", " \\1".$replace ,$t); return $t; } //----------------------------------------- // Post DB parse tags //----------------------------------------- function post_db_parse($t="") { global $ibforums, $DB; if ( $this->pp_do_html ) { $t = $this->post_db_parse_html( $t ); } else { //$t = $this->my_strip_tags( $t ); } if ( $this->pp_wordwrap > 0 ) { $t = $this->my_wordwrap( $t, $this->pp_wordwrap ); } //----------------------------------------- // Custom BB code //----------------------------------------- if ( strstr( $t, '[/' ) ) { $t = $this->post_db_parse_bbcode($t); } return $t; } //----------------------------------------- // Post DB parse BBCode //----------------------------------------- function post_db_parse_bbcode($t="") { global $ibforums, $DB, $std; if ( is_array( $ibforums->cache['bbcode'] ) and count( $ibforums->cache['bbcode'] ) ) { foreach( $ibforums->cache['bbcode'] as $i => $row ) { if ( substr_count( $row['bbcode_replace'], '{content}' ) > 1 ) { //----------------------------------------- // Slightly slower //----------------------------------------- if ( $row['bbcode_useoption'] ) { preg_match_all( "#(\[".preg_quote($row['bbcode_tag'], '#' )."=(?:"|&\#39;)?(.+?)(?:"|&\#39;)?\])(.+?)(\[/".preg_quote($row['bbcode_tag'], '#' )."\])#si", $t, $match ); for ($i=0; $i < count($match[0]); $i++) { $tmp = $row['bbcode_replace']; $tmp = str_replace( '{option}' , $match[2][$i], $tmp ); $tmp = str_replace( '{content}', $match[3][$i], $tmp ); $t = str_replace( $match[0][$i], $tmp, $t ); } } else { preg_match_all( "#(\[".preg_quote($row['bbcode_tag'], '#' )."\])(.+?)(\[/".preg_quote($row['bbcode_tag'], '#' )."\])#si", $t, $match ); for ($i=0; $i < count($match[0]); $i++) { $tmp = $row['bbcode_replace']; $tmp = str_replace( '{content}', $match[2][$i], $tmp ); $t = str_replace( $match[0][$i], $tmp, $t ); } } } else { $replace = explode( '{content}', $row['bbcode_replace'] ); if ( $row['bbcode_useoption'] ) { $t = preg_replace( "#\[".$row['bbcode_tag']."=(?:"|&\#39;)?(.+?)(?:"|&\#39;)?\]#si", str_replace( '{option}', "\\1", $replace[0] ), $t ); } else { $t = preg_replace( '#\['.$row['bbcode_tag'].'\]#i' , $replace[0], $t ); } $t = preg_replace( '#\[/'.$row['bbcode_tag'].'\]#i', $replace[1], $t ); } } } return $t; } //----------------------------------------- // parse_html // Converts the doHTML tag //----------------------------------------- function post_db_parse_html($t="") { if ( $t == "" ) { return $t; } //----------------------------------------- // Remove <br>s 'cos we know they can't // be user inputted, 'cos they are still // <br> at this point :) //----------------------------------------- if ( $this->pp_nl2br != 1 ) { $t = str_replace( "<br>" , "\n" , $t ); $t = str_replace( "<br />" , "\n" , $t ); } $t = str_replace( "'" , "'", $t ); $t = str_replace( "!" , "!", $t ); $t = str_replace( "$" , "$", $t ); $t = str_replace( "|" , "|", $t ); $t = str_replace( "&" , "&", $t ); $t = str_replace( ">" , ">", $t ); $t = str_replace( "<" , "<", $t ); $t = str_replace( """ , '"', $t ); //----------------------------------------- // Take a crack at parsing some of the nasties // NOTE: THIS IS NOT DESIGNED AS A FOOLPROOF METHOD // AND SHOULD NOT BE RELIED UPON! //----------------------------------------- $t = preg_replace( "/javascript/i" , "javascript", $t ); $t = preg_replace( "/alert/i" , "alert" , $t ); $t = preg_replace( "/about:/i" , "about:" , $t ); $t = preg_replace( "/onmouseover/i", "onmouseover" , $t ); $t = preg_replace( "/onclick/i" , "onclick" , $t ); $t = preg_replace( "/onload/i" , "onload" , $t ); $t = preg_replace( "/onsubmit/i" , "onsubmit" , $t ); return $t; } //----------------------------------------- // Badwords: // Swops naughty, naugty words and stuff //----------------------------------------- function bad_words($text = "") { global $DB, $ibforums; if ($text == "") { return ""; } if ( $this->bypass_badwords == 1 ) { return $text; } //----------------------------------------- if ( is_array( $ibforums->cache['badwords'] ) ) { usort( $ibforums->cache['badwords'] , array( 'post_parser', 'word_length_sort' ) ); if ( count($ibforums->cache['badwords']) > 0 ) { foreach($ibforums->cache['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) { $txt = preg_replace( "#<!--emo&(.+?)-->.+?<!--endemo-->#", "\\1" , $txt ); if ($code == 1) { $txt = preg_replace( "#<!--sql-->(.+?)<!--sql1-->(.+?)<!--sql2-->(.+?)<!--sql3-->#eis" , "\$this->unconvert_sql(\"\\2\")", $txt); $txt = preg_replace( "#<!--html-->(.+?)<!--html1-->(.+?)<!--html2-->(.+?)<!--html3-->#e", "\$this->unconvert_htm(\"\\2\")", $txt); $txt = preg_replace( "#<!--Flash (.+?)-->.+?<!--End Flash-->#e" , "\$this->unconvert_flash('\\1')", $txt ); $txt = preg_replace( "#<img src=[\"'](\S+?)['\"].+?".">#" , "\[img\]\\1\[/img\]" , $txt ); $txt = preg_replace( "#<a href=[\"']mailto:(.+?)['\"]>(.+?)</a>#" , "\[email=\\1\]\\2\[/email\]" , $txt ); $txt = preg_replace( "#<a href=[\"'](http://|https://|ftp://|news://)?(\S+?)['\"].+?".">(.+?)</a>#" , "\[url=\\1\\2\]\\3\[/url\]" , $txt ); $txt = preg_replace( "#<!--QuoteBegin-->(.+?)<!--QuoteEBegin-->#" , '[quote]' , $txt ); $txt = preg_replace( "#<!--QuoteBegin-{1,2}([^>]+?)\+([^>]+?)-->(.+?)<!--QuoteEBegin-->#" , "[quote=\\1,\\2]" , $txt ); $txt = preg_replace( "#<!--QuoteBegin-{1,2}([^>]+?)\+-->(.+?)<!--QuoteEBegin-->#" , "[quote=\\1]" , $txt ); $txt = preg_replace( "#<!--QuoteEnd-->(.+?)<!--QuoteEEnd-->#" , '[/quote]' , $txt ); $txt = preg_replace( "#<!--c1-->(.+?)<!--ec1-->#", '[code]' , $txt ); $txt = preg_replace( "#<!--c2-->(.+?)<!--ec2-->#", '[/code]' , $txt ); $txt = preg_replace( "#<i>(.+?)</i>#is" , "\[i\]\\1\[/i\]" , $txt ); $txt = preg_replace( "#<b>(.+?)</b>#is" , "\[b\]\\1\[/b\]" , $txt ); $txt = preg_replace( "#<s>(.+?)</s>#is" , "\[s\]\\1\[/s\]" , $txt ); $txt = preg_replace( "#<u>(.+?)</u>#is" , "\[u\]\\1\[/u\]" , $txt ); $txt = preg_replace( "#(\n){0,}<ul>#" , "\\1\[list\]" , $txt ); $txt = preg_replace( "#(\n){0,}<ol type='(a|A|i|I|1)'>#" , "\\1\[list=\\2\]\n" , $txt ); $txt = preg_replace( "#(\n){0,}<li>#" , "\n\[*\]" , $txt ); $txt = preg_replace( "#(\n){0,}</ul>(\n){0,}#", "\n\[/list\]\\2" , $txt ); $txt = preg_replace( "#(\n){0,}</ol>(\n){0,}#", "\n\[/list\]\\2" , $txt ); while ( preg_match( "#<span style=['\"]font-size:(.+?)pt;line-height:100%['\"]>(.+?)</span>#is", $txt ) ) { $txt = preg_replace( "#<span style=['\"]font-size:(.+?)pt;line-height:100%['\"]>(.+?)</span>#ise" , "\$this->unconvert_size('\\1', '\\2')", $txt ); } while ( preg_match( "#<span style=['\"]color:(.+?)['\"]>(.+?)</span>#is", $txt ) ) { $txt = preg_replace( "#<span style=['\"]color:(.+?)['\"]>(.+?)</span>#is" , "\[color=\\1\]\\2\[/color\]", $txt ); } while ( preg_match( "#<span style=['\"]font-family:(.+?)['\"]>(.+?)</span>#is", $txt ) ) { $txt = preg_replace( "#<span style=['\"]font-family:(.+?)['\"]>(.+?)</span>#is", "\[font=\\1\]\\2\[/font\]", $txt ); } // Tidy up the end quote stuff $txt = preg_replace( "#(\[/QUOTE\])\s*?<br />\s*#si", "\\1\n", $txt ); $txt = preg_replace( "#(\[/QUOTE\])\s*?<br>\s*#si" , "\\1\n", $txt ); $txt = preg_replace( "#<!--EDIT\|.+?\|.+?-->#" , "" , $txt ); $txt = str_replace( "</li>", "", $txt ); $txt = str_replace( "™", "(tm)", $txt ); } if ($html == 1) { $txt = str_replace( "'", "'", $txt); } $txt = str_replace( "<br>" , "\n", $txt ); $txt = str_replace( "<br />", "\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_sql($sql="") { $sql = stripslashes($sql); $sql = preg_replace( "#<span style='.+?'>#is", "", $sql ); $sql = str_replace( "</span>" , "", $sql ); $sql = preg_replace( "#\s*$#" , "", $sql ); return '[sql]'.$sql.'[/sql]'; } function unconvert_htm($html="") { $html = stripslashes($html); $html = preg_replace( "#<span style='.+?'>#is", "", $html ); $html = str_replace( "</span>" , "", $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 "<!--emo&".trim($code)."--><img src='{$ibforums->vars['EMOTICONS_URL']}/$image' border='0' style='vertical-align:middle' alt='$image' /><!--endemo-->"; } /*-------------------------------------------------------------------------*/ // wrap style: // code and quote table HTML generator /*-------------------------------------------------------------------------*/ function wrap_style( $type='quote', $extra="" ) { global $ibforums; $used = array( 'quote' => array( 'title' => 'QUOTE', 'css_top' => 'quotetop' , 'css_main' => 'quotemain' ), 'code' => array( 'title' => 'CODE' , 'css_top' => 'codetop' , 'css_main' => 'codemain' ), 'sql' => array( 'title' => 'SQL' , 'css_top' => 'sqltop' , 'css_main' => 'sqlmain' ), 'html' => array( 'title' => 'HTML' , 'css_top' => 'htmltop' , 'css_main' => 'htmlmain' ) ); return array( 'START' => "<div class='{$used[ $type ]['css_top']}'>{$used[ $type ]['title']}{$extra}</div><div class='{$used[ $type ]['css_main']}'>", 'END' => "</div>" ); } /*-------------------------------------------------------------------------*/ // regex_list: List generation // /*-------------------------------------------------------------------------*/ function regex_list( $txt="", $type="" ) { if ($txt == "") { return; } if ( $type == "" ) { // Unordered list. return "<ul>".$this->regex_list_item($txt)."</ul>"; } else { return "<ol type='$type'>".$this->regex_list_item($txt)."</ol>"; } } function regex_list_item($txt) { $txt = preg_replace( "#\[\*\]#", "</li><li>" , trim($txt) ); $txt = preg_replace( "#^</?li>#" , "", $txt ); return str_replace( "\n</li>", "</li>", $txt."</li>" ); } /*-------------------------------------------------------------------------*/ // regex_html_tag: HTML syntax highlighting // /*-------------------------------------------------------------------------*/ function regex_html_tag($html="") { if ($html == "") 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)\]/i", $html) ) { return $default; } //----------------------------------------- // Take a stab at removing most of the common // smilie characters. //----------------------------------------- $html = preg_replace( "#:#" , ":", $html ); $html = preg_replace( "#\[#" , "[", $html ); $html = preg_replace( "#\]#" , "]", $html ); $html = preg_replace( "#\)#" , ")", $html ); $html = preg_replace( "#\(#" , "(", $html ); $html = preg_replace( "/^<br>/" , "", $html ); $html = preg_replace( "#^<br />#", "", $html ); $html = preg_replace( "/^\s+/" , "", $html ); $html = preg_replace( "#<([^&<>]+)>#" , "<<span style='color:blue'>\\1</span>>" , $html ); //Matches <tag> $html = preg_replace( "#<([^&<>]+)=#" , "<<span style='color:blue'>\\1</span>=" , $html ); //Matches <tag $html = preg_replace( "#</([^&]+)>#" , "</<span style='color:blue'>\\1</span>>" , $html ); //Matches </tag> $html = preg_replace( "!=("|')(.+?)?("|')(\s|>)!" , "=\\1<span style='color:orange'>\\2</span>\\3\\4" , $html ); //Matches ='this' $html = preg_replace( "!<!--(.+?)-->!" , "<!<span style='color:red'>--\\1--</span>>", $html ); $wrap = $this->wrap_style( 'html' ); return "<!--html-->{$wrap['START']}<!--html1-->$html<!--html2-->{$wrap['END']}<!--html3-->"; } /*-------------------------------------------------------------------------*/ // 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 <br>) //----------------------------------------- $sql = preg_replace( "/^<br>/" , "", $sql ); $sql = preg_replace( "#^<br />#", "", $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" , "<span style='color:orange'>\\1</span>", $sql ); $sql = preg_replace( "#(MAX|AVG|SUM|COUNT|MIN)\(#i" , "<span style='color:blue'>\\1</span>(" , $sql ); $sql = preg_replace( "!("|'|')(.+?)("|'|')!i" , "<span style='color:red'>\\1\\2\\3</span>" , $sql ); $sql = preg_replace( "#\s{1,}(AND|OR)\s{1,}#i" , " <span style='color:blue'>\\1</span> " , $sql ); $sql = preg_replace( "#(LEFT|JOIN|WHERE|MODIFY|CHANGE|AS|DISTINCT|IN|ASC|DESC|ORDER BY)\s{1,}#i" , "<span style='color:green'>\\1</span> " , $sql ); $sql = preg_replace( "#LIMIT\s*(\d+)\s*,\s*(\d+)#i" , "<span style='color:green'>LIMIT</span> <span style='color:orange'>\\1, \\2</span>" , $sql ); $sql = preg_replace( "#(FROM|INTO)\s{1,}(\S+?)\s{1,}#i" , "<span style='color:green'>\\1</span> <span style='color:orange'>\\2</span> ", $sql ); $sql = preg_replace( "#(SELECT|INSERT|UPDATE|DELETE|ALTER TABLE|DROP)#i" , "<span style='color:blue;font-weight:bold'>\\1</span>" , $sql ); $html = $this->wrap_style( 'sql' ); return "<!--sql-->{$html['START']}<!--sql1-->{$sql}<!--sql2-->{$html['END']}<!--sql3-->"; } /*-------------------------------------------------------------------------*/ // 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 = str_replace( "&" , "&", $txt ); $txt = preg_replace( "#<#" , "<", $txt ); $txt = preg_replace( "#>#" , ">", $txt ); $txt = preg_replace( "#"#" , """, $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#" , "<br />", $txt ); $txt = preg_replace( "#\n#" , "<br />", $txt ); $txt = preg_replace( "#\s{1};#" , ";", $txt ); //----------------------------------------- // Ensure that spacing is preserved //----------------------------------------- $txt = preg_replace( "#\s{2}#", " ", $txt ); $html = $this->wrap_style( 'code' ); return "<!--c1-->{$html['START']}<!--ec1-->$txt<!--c2-->{$html['END']}<!--ec2-->"; } /*-------------------------------------------------------------------------*/ // 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; if ( substr_count( strtolower($txt), '[quote' ) > $this->max_embed_quotes ) { return $txt; } $txt = str_replace( chr(173).']', ']', $txt ); $this->quote_html = $this->wrap_style('quote'); $txt = preg_replace( "#\[quote\]#ie" , "\$this->regex_simple_quote_tag()" , $txt ); $txt = preg_replace( "#\[quote=([^\],]+?),([^\]]+?)\]#ie" , "\$this->regex_quote_tag('\\1', '\\2')" , $txt ); $txt = preg_replace( "#\[quote=([^\]]+?)\]#ie" , "\$this->regex_quote_tag('\\1', '')" , $txt ); $txt = preg_replace( "#\[/quote\]#ie" , "\$this->regex_close_quote()" , $txt ); $txt = str_replace( "\n", "<br />", $txt ); if ( ($this->quote_open == $this->quote_closed) and ($this->quote_error == 0) ) { $txt = preg_replace( "#(<!--QuoteEBegin-->.+?<!--QuoteEnd-->)#es", "\$this->regex_preserve_spacing('\\1')", trim($txt) ); return $txt; } else { return $the_txt; } } /*-------------------------------------------------------------------------*/ // regex_preserve_spacing: keeps double spaces // without CSS killing <pre> tags /*-------------------------------------------------------------------------*/ function regex_preserve_spacing($txt="") { $txt = preg_replace( "#^<!--QuoteEBegin-->(?:<br>|<br />)#", "<!--QuoteEBegin-->", trim($txt) ); $txt = preg_replace( "#\s{2}#", " ", $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 "<!--QuoteBegin-->{$this->quote_html['START']}<!--QuoteEBegin-->"; } /*-------------------------------------------------------------------------*/ // regex_close_quote: closes a quote tag // /*-------------------------------------------------------------------------*/ function regex_close_quote() { if ($this->quote_open == 0) { $this->quote_error++; return; } $this->quote_closed++; return "<!--QuoteEnd-->{$this->quote_html['END']}<!--QuoteEEnd-->"; } /*-------------------------------------------------------------------------*/ // regex_quote_tag: Builds this quote tag HTML // [QUOTE=Matthew,14 February 2002] /*-------------------------------------------------------------------------*/ function regex_quote_tag($name="", $date="") { global $ibforums; if ( $date != "" ) { $default = "\[quote=$name,$date\]"; } else { $default = "\[quote=$name\]"; } if ( strstr( $name, '<!--c1-->' ) or strstr( $date, '<!--c1-->' ) ) { //----------------------------------------- // Code tag detected... //----------------------------------------- $this->quote_error++; return $default; } $name = str_replace( "+", "+", $name ); $name = str_replace( "-", "-", $name ); $name = str_replace( '[', "[", $name ); $name = str_replace( ']', "]", $name ); $this->quote_open++; if ($date == "") { $html = $this->wrap_style( 'quote', "($name)"); } else { $html = $this->wrap_style( 'quote', "($name @ $date)" ); } $extra = "-".$name.'+'.$date; return "<!--QuoteBegin".$extra."-->{$html['START']}<!--QuoteEBegin-->"; } /*-------------------------------------------------------------------------*/ // regex_check_flash: Checks, and builds the <object> // 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 "<!--Flash $width+$height+$url--><OBJECT CLASSID='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' WIDTH=$width HEIGHT=$height><PARAM NAME=MOVIE VALUE=$url><PARAM NAME=PLAY VALUE=TRUE><PARAM NAME=LOOP VALUE=TRUE><PARAM NAME=QUALITY VALUE=HIGH><EMBED SRC=$url WIDTH=$width HEIGHT=$height PLAY=TRUE LOOP=TRUE QUALITY=HIGH></EMBED></OBJECT><!--End Flash-->"; } /*-------------------------------------------------------------------------*/ // regex_check_image: Checks, and builds the <img> // 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); if ( (! $extension) OR ( preg_match( "#/#", $extension ) ) ) { $this->error = 'invalid_ext'; return $default; } $ibforums->vars['img_ext'] = strtolower($ibforums->vars['img_ext']); if ( ! preg_match( "/".preg_quote($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.... //----------------------------------------- $url = str_replace( " ", "%20", $url ); return "<img src='$url' border='0' alt='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]; } $IN['1'] = preg_replace( "/[&\(\)\.\%\[\]<>]/", "", $IN['1'] ); if ($IN['s'] == 'size') { $IN['1'] = intval($IN['1']) + 7; if ($IN['1'] > 30) { $IN['1'] = 30; } return "<span style='font-size:".$IN['1']."pt;line-height:100%'>".$IN['2']."</span>"; } else if ($IN['s'] == 'col') { $IN[1] = preg_replace( "/[^\d\w\#\s]/s", "", $IN[1] ); return "<span style='color:".$IN[1]."'>".$IN['2']."</span>"; } else if ($IN['s'] == 'font') { $IN['1'] = preg_replace( "/[^\d\w\#\-\_\s]/s", "", $IN['1'] ); return "<span style='font-family:".$IN['1']."'>".$IN['2']."</span>"; } } /*-------------------------------------------------------------------------*/ // 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 / brackets //----------------------------------------- $url['html'] = str_replace( "&" , "&" , $url['html'] ); $url['html'] = str_replace( "[" , "%5b" , $url['html'] ); $url['html'] = str_replace( "]" , "%5d" , $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( "/^<img src/i", $url['show'] )) $skip_it = 1; $url['show'] = preg_replace( "/&/" , "&" , $url['show'] ); $url['show'] = preg_replace( "/javascript:/i", "javascript: ", $url['show'] ); if ( (strlen($url['show']) -58 ) < 3 ) $skip_it = 1; //----------------------------------------- // Make sure it's a "proper" url //----------------------------------------- if (!preg_match( "/^(http|ftp|https|news):\/\//i", $url['show'] )) $skip_it = 1; $show = $url['show']; if ($skip_it != 1) { $stripped = preg_replace( "#^(http|ftp|https|news)://(\S+)$#i", "\\2", $url['show'] ); $uri_type = preg_replace( "#^(http|ftp|https|news)://(\S+)$#i", "\\1", $url['show'] ); $show = $uri_type.'://'.substr( $stripped , 0, 35 ).'...'.substr( $stripped , -15 ); } return $url['st'] . "<a href='".$url['html']."' target='_blank'>".$show."</a>" . $url['end']; } function regex_bash_session($start_tok, $end_tok) { //----------------------------------------- // Case 1: index.php?s=0000 :: Return nothing (parses: index.php) // Case 2: index.php?s=0000&this=1 :: Return ? (parses: index.php?this=1) // Case 3: index.php?this=1&s=0000 :: Return nothing (parses: index.php?this=1) // Case 4: index.php?t=1&s=00&y=2 :: Return & (parses: index.php?t=1&y=2) //----------------------------------------- $start_tok = str_replace( '&', '&', $start_tok ); $end_tok = str_replace( '&', '&', $end_tok ); //1: if ($start_tok == '?' and $end_tok == '') { return ""; } //2: else if ($start_tok == '?' and $end_tok == '&') { return '?'; } //3: else if ($start_tok == '&' and $end_tok == '') { return ""; } else if ($start_tok == '&' and $end_tok == '&') { return "&"; } else { return $start_tok.$end_tok; } } 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; } } ?>