ubb class ubbcode { var $nest; // 递归深度,for debug //可处理标签及处理函数表 var $tags = array( 'url' => '$this->url', 'email' => '$this->email', 'mail' => '$this->email', // 为了容错,[mail]和等效 'img' => '$this->img', 'b' => '$this->simple', 'i' => '$this->simple', 'u' => '$this->simple', 'tt' => '$this->simple', 's' => '$this->simple', 'strike' => '$this->simple', 'h1' => '$this->simple', 'h2' => '$this->simple', 'h3' => '$this->simple', 'h4' => '$this->simple', 'h5' => '$this->simple', 'h6' => '$this->simple', 'sup' => '$this->simple', 'sub' => '$this->simple', 'em' => '$this->simple', 'strong' => '$this->simple', 'code' => '$this->simple', 'small' => '$this->simple', 'big' => '$this->simple', 'blink' => '$this->simple', 'fly' => '$this->fly', 'move' => '$this->move', 'glow' => '$this->CSSStyle', 'shadow' => '$this->CSSStyle', 'blur' => '$this->CSSStyle', 'wave' => '$this->CSSStyle', 'sub' => '$this->simple', 'sup' => '$this->simple', 'size' => '$this->size', 'face' => '$this->face', 'font' => '$this->face', // 为了容错,[font]和[face]等效 'color' => '$this->color', 'html' => '$this->html', 'quote' => '$this->quote', 'swf' => '$this->swf', 'upload' => '$this->upload' ); function ubbcode() { $this->$nest= 0; $this->$sLastModified= sprintf("%s", date("Y-m-j H:i", getlastmod())); } /*********************************************************************** * 对使用者输入的 E-Mail 作简单的检查, * 检查使用者的 E-Mail 字串是否有 @ 字元, * 在 @ 字元前有英文字母或数字,在之后有数节字串, * 最后的小数点后只能有二个或三个英文字母。 * [email protected] 就可以通过检查,[email protected] 就不能通过检查 ************************************************************************/ function emailcheck($str) { if (eregi("^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}$", $str)) return true; else return false; } /*********************************************************************** * 对使用者输入的 URL 作简单的检查, * 目前只能简单判断,不能自动检查fpt,finger等 ************************************************************************/ function checkURL($str) { $bValidURL= true; if (eregi("([a-z0-9-]+([\.][a-z0-9\-]+)+)", $str, $er_arr)) { /* printf ("0. %s \n", $er_arr[0]); printf ("1. %s \n", $er_arr[1]); printf ("2. %s \n", $er_arr[2]); printf ("3. %s \n", $er_arr[3]); printf ("4. %s \n", $er_arr[4]); */ } else $bValidURL= false; return $bValidURL; } /*********************************************************************** * 对使用者输入的 图片URL 作简单的检查, * 目前只能简单判断结尾是否为图片文件 * 不支持由CGI动态生成的图片,比如计数器这类的 ************************************************************************/ function checkImgURL($str) { if ($this->checkURL($str)) { if(eregi("\.(jpeg|jpg|gif|bmp|png|pcx|tiff|tga|lwf)$", $str)) return true; else return false; } else return false; } /*********************************************************************** * 自动补全URL部分,主要是协议前缀, * 默认是htpp://,支持https://;ftp://;finger://;gopher://等 * 函数并不对URL的合法性作检查 ************************************************************************/ function formatURL($str) { if (!eregi("^(ftp|http|https|mms|gopher|finger|bbs|telnet):(\/\/|\\\\)", $str)) $str= 'http://'.$str; return $str; } //对$str进行UBB编码解析 function parse($str) { $nest ++; $parse = ''.($str); $ret = ''; while(true){ //查找[xx] 或者[xx=xx] , 但不包括[xx=] $eregi_ret=eregi("\[([a-z][a-z0-9]{0,7})(=[a-zA-Z0-9#.:/&@|\?,%=_\+\"\']+)?\]", $parse, $eregi_arr); if(!$eregi_ret) { $ret .= $parse; break; //如果没有,返回 } /* for Debug else { printf ("$. %s", $eregi_ret); printf ("0. %s", $eregi_arr[0]); printf ("1. %s", $eregi_arr[1]); printf ("2. %s", $eregi_arr[2]); printf ("3. %s", $eregi_arr[3]); } */ $pos = @strpos($parse, $eregi_arr[0]); // 起始位置 $tag_start= $eregi_arr[1]; $tag= strtolower($eregi_arr[1]); $tag_param= $eregi_arr[2]; $parse2 = substr($parse, 0, $pos);//标记之前 $parse = substr($parse, $pos + $eregi_ret);//标记之后 if(!isset($this->tags[$tag])) { $ret .= $parse2.'['.$tag_start.']'; continue; //如果是不支持的标记 } //查找对应的结束标记 $eregi_ret=eregi("\[(/".$tag.")\]", $parse, $eregi_arr); if(!$eregi_ret) { $ret .= $parse2.'['.$tag_start.$tag_param.']'; continue;//没有对应该的结束标记 } $pos= strpos($parse, $eregi_arr[0]); $value= substr($parse, 0, $pos); //起止标记之间的内容 $tag_end= $eregi_arr[1]; $parse= substr($parse, $pos + $eregi_ret);//结束标记之后的内容 // 允许嵌套标记,递归分析 if (!(($tag == 'code') or ($tag=="url") or ($tag=="email") or ($tag=="img"))){ $value= $this->parse($value); } $ret.= $parse2; $parseFun= sprintf('$ret .= %s($tag_start, $tag_param, $tag_end, $value);', $this->tags[$tag]); eval($parseFun); } $nest --; return $ret; } /***************************************************** * 简单替换,类似[b]变为 * 标签内容不便,只是替代括号为 *****************************************************/ function simple($start, $para, $end, $value){ if (strlen($para) > 0) return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end); else return sprintf("%s", $start, $value, $end); } /***************************************************** * 如下认为合法可以没有“http://”;ftp一定要自己加“ftp://” * 93611 * * http://www.fogsun.com *****************************************************/ function url($start, $para, $end, $value){ $sA= $value; $sURL= substr(trim($para), 1); if (strlen($sURL) > 0) { if (strlen($value) == 0) $sA= $sURL; } else { $sURL= trim($value); } $sURL= $this->formatURL($sURL); if($this->checkURL($sURL)) return "$sA"; else { return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end); } } /***************************************************** * 如下认为合法可以没有“mailto:”头; * [[email protected]]pazee * * [email protected] *****************************************************/ function email($start, $para, $end, $value){ $sA= $value; $sURL= substr(trim($para), 1); if (strlen($sURL) > 0) { if (strlen($value) == 0) $sA= $sURL; } else { $sURL= trim($value); } //if (strtolower(substr($sURL, 0, 7)) != "mailto:") $sURL= "mail. if($this->emailcheck(substr($sURL, 15))) return "$sA"; else return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end); } /***************************************************** * 显示图片;如下用法认为合法 * [img=www.21cn.com/title.jpg][/img] * *****************************************************/ function img($start, $para, $end, $value){ $sURL= substr(trim($para), 1); if (strlen($sURL) $sURL= trim($value); //$sURL= $this->formatURL($sURL); if ($this->checkImgURL($sURL)) return sprintf("", $sURL,$sURL); else return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end); } /***************************************************** * 字符串从右向左循环移动 * 无参数 * 等效与html的 *****************************************************/ function fly($start, $para, $end, $value){ if (strlen($para)>0) // 有参数 return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end); else return ''.$value.''; } /***************************************************** * 字符串来回移动 * 无参数 * 等效与html的 *****************************************************/ function move($start, $para, $end, $value) { if (strlen($para)>0) // 有参数 return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end); else return ''.$value.''; } /***************************************************** * 字符晕光效果包括 glow、shadow和blur * 字符晕光效果[glow=a,b,c]或者[shadow=a,b,c] * 3个参数允许缺省 * 实现文字阴影特效, * glow, shadow,blur 属性依次为颜色、宽度和边界大小 * wave 属性依次为变形频率、宽度和边界大小 *****************************************************/ function CSSStyle(&$start, &$para, &$end, &$value){ $rets= sprintf("[%s%s]%s[%s]", $start, $para, $value, $end); if (strlen($para)==0) { $para="=,,"; } if (eregi("^=([#]?[[:xdigit:]]{6}|[a-z0-9]*),([0-9]*),([0-9]*)", $para, $er_arr)) { $color= ($er_arr[1] != "") ? $er_arr[1] : red; // Default Color $width= ($er_arr[2] != "") ? $er_arr[2] : 400; // Default Width $border= ($er_arr[3] != "") ? $er_arr[3] : 5; // Default Border switch ($start) { case "glow": case "shadow": $rets= sprintf("%s", $start, $color, $border, $width, $value); break; case "blur"; $rets= sprintf("%s", $start, $border, $color, $width, $value); break; case "wave": $color= ($er_arr[1] != "") ? $er_arr[1] : 4; // Default Color $border= ($er_arr[3] != "") ? $er_arr[3] : 2; // Default Border $rets= sprintf("%s", $start, $color, $border, $width, $value); break; } } return $rets; } /***************************************************** * 字体颜色 xxx * n 可以是 #xxxxxx 或者 xxxxxx (6位16进制数) * red,greed,blue,black等颜色保留字也有效 * 等效与html的xxx * [color]xxxx[/color]等效于 [color=red] *****************************************************/ function color($start, $para, $end, $value){ $cl= strtolower(substr($para, 1)); if ($cl == "") $cl= "red"; if (eregi("(^[#]?[[:xdigit:]]{6})|red|green|blue|yellow|blue|white|gray|brown|silver|purple|orange" ,$cl)) return sprintf("%s",$cl, $value); else return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end); } /***************************************************** * 字体大小 xxx 1 * 等效与html的xxx *****************************************************/ function size($start, $para, $end, $value){ $size= substr($para, 1); if ($size >=1 && $size 1)) return sprintf("%s",$size, $value); else return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end); } /***************************************************** * 字体名字 [face=n] n字体名称,不需要引号 * 等效与html的xxx *****************************************************/ function face($start, $para, $end, $value){ $fn= substr($para, 1); if (!eregi("[[:punct:]]", $fn) && strlen($para) > 1) { switch (strtoupper($fn)) { case "ST": $fn= "宋体"; break; case "HT": $fn= "黑体"; break; case "KT": $fn= "楷体_GB2312"; break; case "FT": $fn= "仿宋_GB2312"; break; case "YY": $fn= "幼圆"; break; case "LS": $fn= "隶书"; break; case "XST": $fn= "新宋体"; break; default: $fn= substr($para, 1); } return sprintf("%s",$fn, $value); } else return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end); } /***************************************************** * 文件上传[upload] *****************************************************/ function upload($start, $para, $end, $value){ $fn= trim(substr($para, 1)); if (!eregi("[[:punct:]]", $fn) && strlen($para) > 1) { if (eregi("jpg|jpeg|bmp|gif|png", $fn)) { if ($this->checkImgURL($value)) return sprintf("",$fn,$value,$value); else return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end); } elseif ($fn == "swf") { return sprintf("全屏欣赏 (点右键->另存为可将动画下载)",$fn,$value,$value); } elseif (eregi("rar|zip|doc", $fn)) { return sprintf("点击下载此主题相关附件",$fn,$value); } } else return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end); } /***************************************************** * 调试代码标签[html] *****************************************************/ function html($start, $para, $end, $value) { if (strlen($value) > 0) { $value = eregi_replace('', "", $value); return sprintf("%s [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]",$value); } else { return sprintf("[%s]%s[%s]", $start, $value, $end); } } /***************************************************** * 引用标签[quote] *****************************************************/ function quote($start, $para, $end, $value) { if (strlen($value) > 0) { return sprintf("以下为引用内容:%s",$value); } else { return sprintf("[%s]%s[%s]", $start, $value, $end); } } /***************************************************** * FLASH[swf] *****************************************************/ function swf($start, $para, $end, $value) { if (strlen($value) > 0) { return sprintf ("全屏欣赏 (点右键->另存为可将动画下载)",$value,$value); } else { return sprintf("[%s]%s[%s]", $start, $value, $end); } } } ?> 09-12 15:28