拉莫斯 发表于 2011-5-10 22:36:50

对非法字符串拦截的js

/*

    (C)2001-2009 Comsenz Inc.

    This is NOT a freeware, use is subject to license terms



    $Id: bbcode.js 19432 2010-12-31 03:57:14Z monkey $

*/



var re;



function addslashes(str) {

    return preg_replace(['\\\\', '\\\'', '\\\/', '\\\(', '\\\)', '\\\[', '\\\]', '\\\{', '\\\}', '\\\^', '\\\
, '\\\?', '\\\.', '\\\*', '\\\+', '\\\|'], ['\\\\', '\\\'', '\\/', '\\(', '\\)', '\\[', '\\]', '\\{', '\\}', '\\^', '\\
, '\\?', '\\.', '\\*', '\\+', '\\|'], str);

}



function atag(aoptions, text) {

    if(trim(text) == '') {

      return '';

    }

    var pend = parsestyle(aoptions, '', '');

    href = getoptionvalue('href', aoptions);



    if(href.substr(0, 11) == 'javascript:') {

      return trim(recursion('a', text, 'atag'));

    }



    return pend['prepend'] + '' + trim(recursion('a', text, 'atag')) + '' + pend['append'];

}



function bbcode2html(str) {

    if(str == '') {

      return '';

    }



    if(!fetchCheckbox('bbcodeoff') && allowbbcode) {

      str = str.replace(/\([\s\S]+?)\[\/code\]/ig, function($1, $2) {return parsecode($2);});

    }



    if(!allowhtml || !fetchCheckbox('htmlon')) {

      str = str.replace(/</g, '<');

      str = str.replace(/>/g, '>');

      if(!fetchCheckbox('parseurloff')) {

            str = parseurl(str, 'html', false);

      }

    }



    if(!fetchCheckbox('smileyoff') && allowsmilies) {

      if(typeof smilies_type == 'object') {

            for(var typeid in smilies_array) {

                for(var page in smilies_array) {

                  for(var i in smilies_array) {

                        re = new RegExp(preg_quote(smilies_array), "g");

                        str = str.replace(re, '<img src="' + STATICURL + 'image/smiley/' + smilies_type + '/' + smilies_array + '" border="0" smilieid="' + smilies_array + '" alt="' + smilies_array + '" />');

                  }

                }

            }

      }

    }



    if(!fetchCheckbox('bbcodeoff') && allowbbcode) {

      str = clearcode(str);

      str = str.replace(/\\s*((https?|ftp|gopher|news|telnet|rtsp|mms|callto|bctp|thunder|synacast){1}:\/\/|www\.)([^\[\"']+?)\s*\[\/url\]/ig, function($1, $2, $3, $4) {return cuturl($2 + $4);});

      str = str.replace(/\+?)\]([\s\S]+?)\[\/url\]/ig, '<a href="$1$3" target="_blank">$4</a>');

      str = str.replace(/\(.*?)\[\/email\]/ig, '<a href="mailto:$1">$1</a>');

      str = str.replace(/\*)\](.*?)\[\/email\]/ig, '<a href="mailto:$1" target="_blank">$2</a>');

      str = str.replace(/\+?)\]/ig, '<font color="$1">');

      str = str.replace(/\/ig, '<font size="$1">');

      str = str.replace(/\/ig, '<font style="font-size: $1">');

      str = str.replace(/\+?)\]/ig, '<font face="$1">');

      str = str.replace(/\+?)\]/ig, '<p align="$1">');

      str = str.replace(/\/ig, '<p style="line-height: $1px; text-indent: $2em; text-align: $3;">');

      str = str.replace(/\+?)\]/ig, '<br style="clear: both"><span style="float: $1;">');

      str = str.replace(/\([\s\S]*?)\[\/quote\]\s?\s?/ig, '<div class="quote"><blockquote>$1</blockquote></div>\n');



      re = /\+))?)?\]\s*([\s\S]+?)\s*\[\/table\]/ig;

      for (i = 0; i < 4; i++) {

            str = str.replace(re, function($1, $2, $3, $4) {return parsetable($2, $3, $4);});

      }



      str = preg_replace([

            '\\\[\\\/color\\\]', '\\\[\\\/size\\\]', '\\\[\\\/font\\\]', '\\\[\\\/align\\\]', '\\\[\\\/p\\\]', '\\\', '\\\[\\\/b\\\]',

            '\\\', '\\\[\\\/i\\\]', '\\\', '\\\[\\\/u\\\]', '\\\', '\\\[\\\/s\\\]', '\\\', '\\\', '\\\', '\\\',

            '\\\', '\\s?\\\[\\\*\\\]', '\\\[\\\/list\\\]', '\\\', '\\\[\\\/indent\\\]', '\\\[\\\/float\\\]'

            ], [

            '</font>', '</font>', '</font>', '</p>', '</p>', '<b>', '</b>', '<i>',

            '</i>', '<u>', '</u>', '<strike>', '</strike>', '<hr class="l" />', '<ul>', '<ul type=1 class="litype_1">', '<ul type=a class="litype_2">',

            '<ul type=A class="litype_3">', '<li>', '</ul>', '<blockquote>', '</blockquote>', '</span>'

            ], str, 'g');

    }



    if(!fetchCheckbox('bbcodeoff')) {

      if(allowimgcode) {

            str = str.replace(/\\s*([^\[\<\r\n]+?)\s*\[\/img\]/ig, '<img src="$1" border="0" alt="" style="max-width:400px" />');

            str = str.replace(/\(\d+)\[\/attachimg\]/ig, function ($1, $2) {

                if(!$('image_' + $2)) {

                  return '';

                }

                width = $('image_' + $2).getAttribute('cwidth');

                if(!width) {

                  re = /cwidth=(["']?)(\d+)(\1)/i;

                  var matches = re.exec($('image_' + $2).outerHTML);

                  if(matches != null) {

                        width = matches;

                  }

                }

                return '<img src="' + $('image_' + $2).src + '" border="0" aid="attachimg_' + $2 + '" width="' + width + '" alt="" style="max-width:400px" />';

            });

            str = str.replace(/\(\d{1,4})\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/ig, function ($1, $2, $3, $4) {return '<img' + ($2 > 0 ? ' width="' + $2 + '"' : '') + ($3 > 0 ? ' height="' + $3 + '"' : '') + ' src="' + $4 + '" border="0" alt="" style="max-width:400px" />'});

      } else {

            str = str.replace(/\\s*([^\[\<\r\n]+?)\s*\[\/img\]/ig, '<a href="$1" target="_blank">$1</a>');

            str = str.replace(/\(\d{1,4})\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/ig, '<a href="$1" target="_blank">$1</a>');

      }

    }



    for(var i = 0; i <= DISCUZCODE['num']; i++) {

      str = str.replace("[\tDISCUZ_CODE_" + i + "\t]", DISCUZCODE['html']);

    }



    if(!allowhtml || !fetchCheckbox('htmlon')) {

      str = preg_replace(['\t', '   ', '', '(\r\n|\n|\r)'], ['      ', '   ', '', '<br />'], str);

    }



    return str;

}



function clearcode(str) {

    str= str.replace(/\\[\/url\]/ig, '', str);

    str= str.replace(/\+?)\]\[\/url\]/ig, '', str);

    str= str.replace(/\\[\/email\]/ig, '', str);

    str= str.replace(/\*)\]\[\/email\]/ig, '', str);

    str= str.replace(/\+?)\]\[\/color\]/ig, '', str);

    str= str.replace(/\\[\/size\]/ig, '', str);

    str= str.replace(/\\[\/size\]/ig, '', str);

    str= str.replace(/\+?)\]\[\/font\]/ig, '', str);

    str= str.replace(/\+?)\]\[\/align\]/ig, '', str);

    str= str.replace(/\\[\/p\]/ig, '', str);

    str= str.replace(/\+?)\]\[\/float\]/ig, '', str);

    str= str.replace(/\\[\/quote\]/ig, '', str);

    str= str.replace(/\\[\/code\]/ig, '', str);

    str= str.replace(/\\[\/table\]/ig, '', str);

    str= str.replace(/\\[\/free\]/ig, '', str);

    str= str.replace(/\\[\/b]/ig, '', str);

    str= str.replace(/\\[\/u]/ig, '', str);

    str= str.replace(/\\[\/i]/ig, '', str);

    str= str.replace(/\\[\/s]/ig, '', str);

    return str;

}



function cuturl(url) {

    var length = 65;

    var urllink = '<a href="' + (url.toLowerCase().substr(0, 4) == 'www.' ? 'http://' + url : url) + '" target="_blank">';

    if(url.length > length) {

      url = url.substr(0, parseInt(length * 0.5)) + ' ... ' + url.substr(url.length - parseInt(length * 0.3));

    }

    urllink += url + '</a>';

    return urllink;

}



function dstag(options, text, tagname) {

    if(trim(text) == '') {

      return '\n';

    }

    var pend = parsestyle(options, '', '');

    var prepend = pend['prepend'];

    var append = pend['append'];

    if(in_array(tagname, ['div', 'p'])) {

      align = getoptionvalue('align', options);

      if(in_array(align, ['left', 'center', 'right'])) {

            prepend = '' + prepend;

            append += '';

      } else {

            append += '\n';

      }

    }

    return prepend + recursion(tagname, text, 'dstag') + append;

}



function ptag(options, text, tagname) {

    if(trim(text) == '') {

      return '\n';

    }

    if(trim(options) == '') {

      return text + '\n';

    }



    var lineHeight = null;

    var textIndent = null;

    var align, re, matches;



    re = /line-height\s?:\s?(\d{1,3})px/i;

    matches = re.exec(options);

    if(matches != null) {

      lineHeight = matches;

    }



    re = /text-indent\s?:\s?(\d{1,3})em/i;

    matches = re.exec(options);

    if(matches != null) {

      textIndent = matches;

    }



    re = /text-align\s?:\s?(left|center|right)/i;

    matches = re.exec(options);

    if(matches != null) {

      align = matches;

    } else {

      align = getoptionvalue('align', options);

    }

    align = in_array(align, ['left', 'center', 'right']) ? align : 'left';



    if(lineHeight === null && textIndent === null) {

      return '' + text + '';

    } else {

      return '' + text + '';

    }

}



function fetchCheckbox(cbn) {

    return $(cbn) && $(cbn).checked == true ? 1 : 0;

}



function fetchoptionvalue(option, text) {

    if((position = strpos(text, option)) !== false) {

      delimiter = position + option.length;

      if(text.charAt(delimiter) == '"') {

            delimchar = '"';

      } else if(text.charAt(delimiter) == '\'') {

            delimchar = '\'';

      } else {

            delimchar = ' ';

      }

      delimloc = strpos(text, delimchar, delimiter + 1);

      if(delimloc === false) {

            delimloc = text.length;

      } else if(delimchar == '"' || delimchar == '\'') {

            delimiter++;

      }

      return trim(text.substr(delimiter, delimloc - delimiter));

    } else {

      return '';

    }

}



function fonttag(fontoptions, text) {

    var prepend = '';

    var append = '';

    var tags = new Array();

    tags = {'font' : 'face=', 'size' : 'size=', 'color' : 'color='};

    for(bbcode in tags) {

      optionvalue = fetchoptionvalue(tags, fontoptions);

      if(optionvalue) {

            prepend += '[' + bbcode + '=' + optionvalue + ']';

            append = '[/' + bbcode + ']' + append;

      }

    }



    var pend = parsestyle(fontoptions, prepend, append);

    return pend['prepend'] + recursion('font', text, 'fonttag') + pend['append'];

}



function getoptionvalue(option, text) {

    re = new RegExp(option + "(\s+?)?\=(\s+?)?[\"']?(.+?)([\"']|$|>)", "ig");

    var matches = re.exec(text);

    if(matches != null) {

      return trim(matches);

    }

    return '';

}



function html2bbcode(str) {



    if((allowhtml && fetchCheckbox('htmlon')) || trim(str) == '') {

      str = str.replace(/<img[^>]+smilieid=(["']?)(\d+)(\1)[^>]*>/ig, function($1, $2, $3) {return smileycode($3);});

      str = str.replace(/<img([^>]*aid=[^>]*)>/ig, function($1, $2) {return imgtag($2);});

      return str;

    }



    str = str.replace(/<div\sclass=["']?blockcode["']?>[\s\S]*?<blockquote>([\s\S]+?)<\/blockquote>[\s\S]*?<\/div>/ig, function($1, $2) {return codetag($2);});



    str = preg_replace(['<style.*?>[\\\s\\\S]*?<\/style>', '<script.*?>[\\\s\\\S]*?<\/script>', '<noscript.*?>[\\\s\\\S]*?<\/noscript>', '<select.*?>[\s\S]*?<\/select>', '<object.*?>[\s\S]*?<\/object>', '<!--[\\\s\\\S]*?-->', ' on{3,16}\\\s?=\\\s?"[\\\s\\\S]*?"'], '', str);



    str= str.replace(/(\r\n|\n|\r)/ig, '');



    str= str.replace(/&((#(32|127|160|173))|shy|nbsp);/ig, ' ');



    if(!fetchCheckbox('parseurloff')) {

      str = parseurl(str, 'bbcode', false);

    }



    str = str.replace(/<br\s+?style=(["']?)clear: both;?(\1)[^\>]*>/ig, '');

    str = str.replace(/<br[^\>]*>/ig, "\n");



    if(!fetchCheckbox('bbcodeoff') && allowbbcode) {

      str = preg_replace([

            '<table([^>]*(width|background|background-color|bgcolor)[^>]*)>',

            '<table[^>]*>',

            '<tr[^>]*(?:background|background-color|bgcolor)[:=]\\\s*(["\']?)([\(\)\\\s%,#\\\w]+)(\\1)[^>]*>',

            '<tr[^>]*>',

            '(<t([^>]*(left|center|right)[^>]*)>)\\\s*([\\\s\\\S]+?)\\\s*(<\/t>)',

            '<t([^>]*(width|colspan|rowspan)[^>]*)>',

            '<t[^>]*>',

            '<\/t>',

            '<\/tr>',

            '<\/table>'

      ], [

            function($1, $2) {return tabletag($2);},

            '\n',

            function($1, $2, $3) {return '';},

            '',

            function($1, $2, $3, $4, $5, $6) {return $2 + '' + $5 + '' + $6},

            function($1, $2) {return tdtag($2);},

            '',

            '',

            '\n',

            ''

      ], str);



      str = str.replace(/<h(+)[^>]*>(.*)<\/h\\1>/ig, "$2\n\n");

      str = str.replace(/<hr[^>]*>/ig, "");

      str = str.replace(/<img[^>]+smilieid=(["']?)(\d+)(\1)[^>]*>/ig, function($1, $2, $3) {return smileycode($3);});

      str = str.replace(/<img([^>]*src[^>]*)>/ig, function($1, $2) {return imgtag($2);});

      str = str.replace(/<a\s+?name=(["']?)(.+?)(\1)[\s\S]*?>([\s\S]*?)<\/a>/ig, '$4');

      str = str.replace(/<div[^>]*quote[^>]*><blockquote>([\s\S]*?)<\/blockquote><\/div>([\s\S]*?)(<br[^>]*>)?/ig, "$1");

      str = str.replace(/<div[^>]*blockcode[^>]*><blockquote>([\s\S]*?)<\/blockquote><\/div>([\s\S]*?)(<br[^>]*>)?/ig, "$1");



      str = recursion('b', str, 'simpletag', 'b');

      str = recursion('strong', str, 'simpletag', 'b');

      str = recursion('i', str, 'simpletag', 'i');

      str = recursion('em', str, 'simpletag', 'i');

      str = recursion('u', str, 'simpletag', 'u');

      str = recursion('strike', str, 'simpletag', 's');

      str = recursion('a', str, 'atag');

      str = recursion('font', str, 'fonttag');

      str = recursion('blockquote', str, 'simpletag', 'indent');

      str = recursion('ol', str, 'listtag');

      str = recursion('ul', str, 'listtag');

      str = recursion('div', str, 'dstag');

      str = recursion('p', str, 'ptag');

      str = recursion('span', str, 'dstag');

    }



    str = str.replace(/<[\/\!]*?[^<>]*?>/ig, '');



    for(var i = 0; i <= DISCUZCODE['num']; i++) {

      str = str.replace("[\tDISCUZ_CODE_" + i + "\t]", DISCUZCODE['html']);

    }

    str = clearcode(str);



    return preg_replace([' ', '<', '>', '&'], [' ', '<', '>', '&'], str);

}



function tablesimple(s, table, str) {

    if(strpos(str, '[tr=') || strpos(str, '[td=')) {

      return s;

    } else {

      return '\n' + preg_replace(['\\\', '\\\[\\\/td\\\]\\\s?\\\', '\\\[\\\/tr\\\]\s?', '\\\', '\\\[\\\/td\\\]', '\\\[\\\/td\\\]\\\[\\\/tr\\\]'], ['', '|', '', '', '', '', ''], str) + '';

    }

}



function imgtag(attributes) {

    var width = '';

    var height = '';



    re = /src=(["']?)([\s\S]*?)(\1)/i;

    var matches = re.exec(attributes);

    if(matches != null) {

      var src = matches;

    } else {

      return '';

    }



    re = /(max-)?width\s?:\s?(\d{1,4})(px)?/i;

    var matches = re.exec(attributes);

    if(matches != null && !matches) {

      width = matches;

    }



    re = /height\s?:\s?(\d{1,4})(px)?/i;

    var matches = re.exec(attributes);

    if(matches != null) {

      height = matches;

    }



    if(!width) {

      re = /width=(["']?)(\d+)(\1)/i;

      var matches = re.exec(attributes);

      if(matches != null) {

            width = matches;

      }

    }



    if(!height) {

      re = /height=(["']?)(\d+)(\1)/i;

      var matches = re.exec(attributes);

      if(matches != null) {

            height = matches;

      }

    }



    re = /aid=(["']?)attachimg_(\d+)(\1)/i;

    var matches = re.exec(attributes);

    if(matches != null) {

      return '' + matches + '';

    }



    width = width > 0 ? width : 0;

    height = height > 0 ? height : 0;

    return width > 0 || height > 0 ?

      '' + src + '' :

      '' + src + '';

}



function listtag(listoptions, text, tagname) {

    text = text.replace(/<li>(([\s\S](?!<\/li))*?)(?=<\/?ol|<\/?ul|<li|\[list|\[\/list)/ig, '<li>$1</li>') + (BROWSER.opera ? '</li>' : '');

    text = recursion('li', text, 'litag');

    var opentag = '';

    var listtype = fetchoptionvalue('type=', listoptions);

    listtype = listtype != '' ? listtype : (tagname == 'ol' ? '1' : '');

    if(in_array(listtype, ['1', 'a', 'A'])) {

      opentag = '';

    }

    return text ? opentag + '\n' + recursion(tagname, text, 'listtag') + '' : '';

}



function litag(listoptions, text) {

    return '[*]' + text.replace(/(\s+)$/g, '') + '\n';

}



function parsecode(text) {

    DISCUZCODE['num']++;

    DISCUZCODE['html']] = '<div class="blockcode"><blockquote>' + htmlspecialchars(text) + '</blockquote></div>';

    return "[\tDISCUZ_CODE_" + DISCUZCODE['num'] + "\t]";

}



function parsestyle(tagoptions, prepend, append) {

    var searchlist = [

      ['align', true, 'text-align:\\s*(left|center|right);?', 1],

      ['float', true, 'float:\\s*(left|right);?', 1],

      ['color', true, '(^|[;\\s])color:\\s*([^;]+);?', 2],

      ['font', true, 'font-family:\\s*([^;]+);?', 1],

      ['size', true, 'font-size:\\s*(\\d+(\\.\\d+)?(px|pt|in|cm|mm|pc|em|ex|%|));?', 1],

      ['size', true, 'font-size:\\s*(x\\-small|small|medium|large|x\\-large|xx\\-large|\\-webkit\\-xxx\\-large);?', 1, 'size'],

      ['b', false, 'font-weight:\\s*(bold);?'],

      ['i', false, 'font-style:\\s*(italic);?'],

      ['u', false, 'text-decoration:\\s*(underline);?'],

      ['s', false, 'text-decoration:\\s*(line-through);?']

    ];

    var sizealias = {'x-small':1,'small':2,'medium':3,'large':4,'x-large':5,'xx-large':6,'-webkit-xxx-large':7};

    var style = getoptionvalue('style', tagoptions);

    re = /^(?:\s|)color:\s*rgb\((\d+),\s*(\d+),\s*(\d+)\)(;?)/i;

    style = style.replace(re, function($1, $2, $3, $4, $5) {return("color:#" + parseInt($2).toString(16) + parseInt($3).toString(16) + parseInt($4).toString(16) + $5);});

    var len = searchlist.length;

    for(var i = 0; i < len; i++) {

      searchlist = !searchlist ? '' : searchlist;

      re = new RegExp(searchlist, "ig");

      match = re.exec(style);

      if(match != null) {

            opnvalue = match];

            if(searchlist == 'size') {

                opnvalue = sizealias;

            }

            prepend += '[' + searchlist + (searchlist == true ? '=' + opnvalue + ']' : ']');

            append = '[/' + searchlist + ']' + append;

      }

    }

    return {'prepend' : prepend, 'append' : append};

}



function parsetable(width, bgcolor, str) {



    if(isUndefined(width)) {

      var width = '';

    } else {

      try {

            width = width.substr(width.length - 1, width.length) == '%' ? (width.substr(0, width.length - 1) <= 98 ? width : '98%') : (width <= 560 ? width : '98%');

      } catch(e) { width = ''; }

    }

    if(isUndefined(str)) {

      return;

    }



    if(strpos(str, '') === false && strpos(str, '') === false) {

      var rows = str.split('\n');

      var s = '';

      for(i = 0;i < rows.length;i++) {

            s += '<tr><td>' + preg_replace(['\r', '\\\\\\\|', '\\\|', '\\\\n'], ['', '|', '</td><td>', '\n'], rows) + '</td></tr>';

      }

      str = s;

      simple = ' simpletable';

    } else {

      simple = '';

      str = str.replace(/\+))?\]\s*\/ig, function($1, $2, $3) {

            return '<tr' + ($2 ? ' style="background-color: ' + $2 + '"' : '') + '><td' + ($3 ? ' width="' + $3 + '"' : '') + '>';

      });

      str = str.replace(/\+))?\]\s*\/ig, function($1, $2, $3, $4, $5) {

            return '<tr' + ($2 ? ' style="background-color: ' + $2 + '"' : '') + '><td' + ($3 ? ' colspan="' + $3 + '"' : '') + ($4 ? ' rowspan="' + $4 + '"' : '') + ($5 ? ' width="' + $5 + '"' : '') + '>';

      });

      str = str.replace(/\[\/td\]\s*\/ig, function($1, $2) {

            return '</td><td' + ($2 ? ' width="' + $2 + '"' : '') + '>';

      });

      str = str.replace(/\[\/td\]\s*\/ig, function($1, $2, $3, $4) {

            return '</td><td' + ($2 ? ' colspan="' + $2 + '"' : '') + ($3 ? ' rowspan="' + $3 + '"' : '') + ($4 ? ' width="' + $4 + '"' : '') + '>';

      });

      str = str.replace(/\[\/td\]\s*\[\/tr\]\s*/ig, '</td></tr>');

      str = str.replace(/<td> <\/td>/ig, '<td> </td>');

    }

    return '<table ' + (width == '' ? '' : 'width="' + width + '" ') + 'class="t_table"' + (isUndefined(bgcolor) ? '' : ' style="background-color: ' + bgcolor + '"') + simple +'>' + str + '</table>';

}



function preg_quote(str) {

    return (str+'').replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!<>\|\:])/g, "\\$1");

}



function recursion(tagname, text, dofunction, extraargs) {

    if(extraargs == null) {

      extraargs = '';

    }

    tagname = tagname.toLowerCase();



    var open_tag = '<' + tagname;

    var open_tag_len = open_tag.length;

    var close_tag = '</' + tagname + '>';

    var close_tag_len = close_tag.length;

    var beginsearchpos = 0;



    do {

      var textlower = text.toLowerCase();

      var tagbegin = textlower.indexOf(open_tag, beginsearchpos);

      if(tagbegin == -1) {

            break;

      }



      var strlen = text.length;



      var inquote = '';

      var found = false;

      var tagnameend = false;

      var optionend = 0;

      var t_char = '';



      for(optionend = tagbegin; optionend <= strlen; optionend++) {

            t_char = text.charAt(optionend);

            if((t_char == '"' || t_char == "'") && inquote == '') {

                inquote = t_char;

            } else if((t_char == '"' || t_char == "'") && inquote == t_char) {

                inquote = '';

            } else if(t_char == '>' && !inquote) {

                found = true;

                break;

            } else if((t_char == '=' || t_char == ' ') && !tagnameend) {

                tagnameend = optionend;

            }

      }



      if(!found) {

            break;

      }

      if(!tagnameend) {

            tagnameend = optionend;

      }



      var offset = optionend - (tagbegin + open_tag_len);

      var tagoptions = text.substr(tagbegin + open_tag_len, offset);

      var acttagname = textlower.substr(tagbegin * 1 + 1, tagnameend - tagbegin - 1);



      if(acttagname != tagname) {

            beginsearchpos = optionend;

            continue;

      }



      var tagend = textlower.indexOf(close_tag, optionend);

      if(tagend == -1) {

            break;

      }



      var nestedopenpos = textlower.indexOf(open_tag, optionend);

      while(nestedopenpos != -1 && tagend != -1) {

            if(nestedopenpos > tagend) {

                break;

            }

            tagend = textlower.indexOf(close_tag, tagend + close_tag_len);

            nestedopenpos = textlower.indexOf(open_tag, nestedopenpos + open_tag_len);

      }



      if(tagend == -1) {

            beginsearchpos = optionend;

            continue;

      }



      var localbegin = optionend + 1;

      var localtext = eval(dofunction)(tagoptions, text.substr(localbegin, tagend - localbegin), tagname, extraargs);



      text = text.substring(0, tagbegin) + localtext + text.substring(tagend + close_tag_len);



      beginsearchpos = tagbegin + localtext.length;



    } while(tagbegin != -1);



    return text;

}



function simpletag(options, text, tagname, parseto) {

    if(trim(text) == '') {

      return '';

    }

    text = recursion(tagname, text, 'simpletag', parseto);

    return '[' + parseto + ']' + text + '[/' + parseto + ']';

}



function smileycode(smileyid) {

    if(typeof smilies_type != 'object') return;

    for(var typeid in smilies_array) {

      for(var page in smilies_array) {

            for(var i in smilies_array) {

                if(smilies_array == smileyid) {

                  return smilies_array;

                  break;

                }

            }

      }

    }

}



function strpos(haystack, needle, _offset) {

    if(isUndefined(_offset)) {

      _offset = 0;

    }



    var _index = haystack.toLowerCase().indexOf(needle.toLowerCase(), _offset);



    return _index == -1 ? false : _index;

}



function tabletag(attributes) {

    var width = '';

    re = /width=(["']?)(\d{1,4}%?)(\1)/i;

    var matches = re.exec(attributes);



    if(matches != null) {

      width = matches.substr(matches.length - 1, matches.length) == '%' ?

            (matches.substr(0, matches.length - 1) <= 98 ? matches : '98%') :

            (matches <= 560 ? matches : '98%');

    } else {

      re = /width\s?:\s?(\d{1,4})()/i;

      var matches = re.exec(attributes);

      if(matches != null) {

            width = matches == '%' ? (matches <= 98 ? matches + '%' : '98%') : (matches <= 560 ? matches : '98%');

      }

    }



    var bgcolor = '';

    re = /(?:background|background-color|bgcolor)[:=]\s*(["']?)((rgb\(\d{1,3}%?,\s*\d{1,3}%?,\s*\d{1,3}%?\))|(#{3,6})|({1,20}))(\1)/i;

    var matches = re.exec(attributes);

    if(matches != null) {

      bgcolor = matches;

      width = width ? width : '98%';

    }



    return bgcolor ? '\n' : (width ? '\n' : '\n');

}



function tdtag(attributes) {



    var colspan = 1;

    var rowspan = 1;

    var width = '';



    re = /colspan=(["']?)(\d{1,2})(\1)/i;

    var matches = re.exec(attributes);

    if(matches != null) {

      colspan = matches;

    }



    re = /rowspan=(["']?)(\d{1,2})(\1)/i;

    var matches = re.exec(attributes);

    if(matches != null) {

      rowspan = matches;

    }



    re = /width=(["']?)(\d{1,4}%?)(\1)/i;

    var matches = re.exec(attributes);

    if(matches != null) {

      width = matches;

    }



    return in_array(width, ['', '0', '100%']) ?

      (colspan == 1 && rowspan == 1 ? '' : '') :

      (colspan == 1 && rowspan == 1 ? '' : '');

}

眼镜蛇 发表于 2011-5-10 22:44:01

试着用用代码引用功能
页: [1]
查看完整版本: 对非法字符串拦截的js