Discuz教程网

PHP操作ubb代码类

[复制链接]
authicon dly 发表于 2011-1-7 12:43:29 | 显示全部楼层 |阅读模式
  1. //ubbcode类  
  2. class ubbcode
  3. {  
  4.     var $nest;  // 递归深度,for debug
  5.     //可处理标签及处理函数表  
  6.     var $tags = array(
  7.         \'url\' => \'$this->url\',  
  8.         \'email\' => \'$this->email\',  
  9.         \'mail\' => \'$this->email\',  // 为了容错,[mail]和[email]等效
  10.         \'img\' => \'$this->img\',  
  11.         \'b\' => \'$this->simple\',  
  12.         \'i\' => \'$this->simple\',  
  13.         \'u\' => \'$this->simple\',  
  14.         \'tt\' => \'$this->simple\',  
  15.         \'s\' => \'$this->simple\',  
  16.         \'strike\' => \'$this->simple\',  
  17.         \'h1\' => \'$this->simple\',  
  18.         \'h2\' => \'$this->simple\',  
  19.         \'h3\' => \'$this->simple\',  
  20.         \'h4\' => \'$this->simple\',  
  21.         \'h5\' => \'$this->simple\',  
  22.         \'h6\' => \'$this->simple\',  
  23.         \'sup\' => \'$this->simple\',  
  24.         \'sub\' => \'$this->simple\',  
  25.         \'em\' => \'$this->simple\',  
  26.         \'strong\' => \'$this->simple\',  
  27.         \'code\' => \'$this->simple\',   
  28.         \'small\' => \'$this->simple\',  
  29.         \'big\' => \'$this->simple\',  
  30.         \'blink\' => \'$this->simple\',
  31.         \'fly\' => \'$this->fly\',
  32.         \'move\' => \'$this->move\',
  33.         \'glow\' => \'$this->CSSStyle\',
  34.         \'shadow\' => \'$this->CSSStyle\',
  35.         \'blur\' => \'$this->CSSStyle\',
  36.         \'wave\' => \'$this->CSSStyle\',
  37.         \'sub\' => \'$this->simple\',
  38.         \'sup\' => \'$this->simple\',
  39.         \'size\' => \'$this->size\',
  40.         \'face\' => \'$this->face\',
  41.         \'font\' => \'$this->face\',  // 为了容错,[font]和[face]等效
  42.         \'color\' => \'$this->color\',
  43.         \'html\' => \'$this->html\',
  44.         \'quote\' => \'$this->quote\',
  45.         \'swf\' => \'$this->swf\',
  46.         \'upload\' => \'$this->upload\'
  47.         );  
  48.     function ubbcode()
  49.     {  
  50.       $this->$nest= 0;
  51.       $this->$sLastModified= sprintf("%s", date("Y-m-j H:i", getlastmod()));
  52.     }  

  53.     /***********************************************************************
  54.     *  对使用者输入的 E-Mail 作简单的检查,
  55.     *  检查使用者的 E-Mail 字串是否有 @ 字元,
  56.     *  在 @ 字元前有英文字母或数字,在之后有数节字串,
  57.     *  最后的小数点后只能有二个或三个英文字母。
  58.     *  [email]super@mail.wilson.gs[/email] 就可以通过检查,[email]super@mail.wilson[/email] 就不能通过检查
  59.     ************************************************************************/
  60.     function emailcheck($str)
  61.     {
  62.       if (eregi("^[_\\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\\.)+[a-z]{2,3}$", $str))
  63.         return true;
  64.       else
  65.         return false;  
  66.     }
  67.     /***********************************************************************
  68.     *  对使用者输入的 URL 作简单的检查,
  69.     *  目前只能简单判断,不能自动检查fpt,finger等
  70.     ************************************************************************/
  71.     function checkURL($str)
  72.     {
  73.       $bValidURL= true;
  74.       if (eregi("([a-z0-9-]+([\\.][a-z0-9\\-]+)+)", $str, $er_arr))
  75.       {   
  76.   /*
  77.   printf ("0. %s
  78. \\n", $er_arr[0]);
  79.   printf ("1. %s
  80. \\n", $er_arr[1]);
  81.   printf ("2. %s
  82. \\n", $er_arr[2]);
  83.   printf ("3. %s
  84. \\n", $er_arr[3]);
  85.   printf ("4. %s
  86. \\n", $er_arr[4]);
  87.   */
  88.       }
  89.       else
  90.          $bValidURL= false;
  91.       return $bValidURL;
  92.     }
  93.     /***********************************************************************
  94.     *  对使用者输入的 图片URL 作简单的检查,
  95.     *  目前只能简单判断结尾是否为图片文件
  96.     *  不支持由CGI动态生成的图片,比如计数器这类的
  97.     ************************************************************************/
  98.     function checkImgURL($str)
  99.     {
  100.       if ($this->checkURL($str)) {
  101.         if(eregi("\\.(jpeg|jpg|gif|bmp|png|pcx|tiff|tga|lwf)$", $str))
  102.           return true;
  103.         else
  104.           return false;
  105.       }
  106.       else
  107.         return false;
  108.     }
  109.     /***********************************************************************
  110.     *  自动补全URL部分,主要是协议前缀,
  111.     *  默认是htpp://,支持https://;ftp://;finger://;gopher://等
  112.     *  函数并不对URL的合法性作检查
  113.     ************************************************************************/
  114.     function formatURL($str)
  115.     {
  116.       if (!eregi("^(ftp|http|https|mms|gopher|finger|bbs|telnet)\\/\\/|\\\\\\\\)", $str))
  117.         $str= \'http://\'.$str;
  118.       return $str;
  119.     }
  120.     //对$str进行UBB编码解析  
  121.     function parse($str)
  122.     {  
  123.         $nest ++;
  124.         $parse = \'\'.($str);  
  125.         $ret = \'\';  
  126.         while(true){  
  127.             //查找[xx] 或者[xx=xx] , 但不包括[xx=]
  128.             $eregi_ret=eregi("\\[([a-z][a-z0-9]{0,7})(=[a-zA-Z0-9#.:/&@|\\?,%=_\\+\\"\\\']+)?\\]", $parse, $eregi_arr);
  129.             if(!$eregi_ret)
  130.             {  
  131.                 $ret .= $parse;  
  132.                 break; //如果没有,返回  
  133.             }
  134. /*  for Debug
  135.             else
  136.             {
  137.               printf ("$. %s
  138. ", $eregi_ret);
  139.               printf ("0. %s
  140. ", $eregi_arr[0]);
  141.               printf ("1. %s
  142. ", $eregi_arr[1]);
  143.               printf ("2. %s
  144. ", $eregi_arr[2]);
  145.               printf ("3. %s
  146. ", $eregi_arr[3]);
  147.             }
  148. */

  149.             $pos = @strpos($parse, $eregi_arr[0]);  // 起始位置
  150.             $tag_start= $eregi_arr[1];
  151.             $tag= strtolower($eregi_arr[1]);
  152.             $tag_param= $eregi_arr[2];
  153.             $parse2 = substr($parse, 0, $pos);//标记之前
  154.             $parse = substr($parse, $pos + $eregi_ret);//标记之后
  155.             if(!isset($this->tags[$tag]))
  156.             {  
  157.                 $ret .= $parse2.\'[\'.$tag_start.\']\';  
  158.                 continue;    //如果是不支持的标记  
  159.             }  
  160.             //查找对应的结束标记  
  161.             $eregi_ret=eregi("\\[(/".$tag.")\\]", $parse, $eregi_arr);  
  162.             if(!$eregi_ret)
  163.             {  
  164.                 $ret .= $parse2.\'[\'.$tag_start.$tag_param.\']\';  
  165.                 continue;//没有对应该的结束标记  
  166.             }  
  167.             $pos= strpos($parse, $eregi_arr[0]);  
  168.             $value= substr($parse, 0, $pos);   //起止标记之间的内容
  169.             $tag_end= $eregi_arr[1];
  170.             $parse= substr($parse, $pos + $eregi_ret);//结束标记之后的内容  
  171.             // 允许嵌套标记,递归分析
  172.             if (!(($tag == \'code\') or ($tag=="url") or ($tag=="email") or ($tag=="img"))){
  173.                 $value= $this->parse($value);  
  174.             }
  175.             $ret.= $parse2;
  176.             $parseFun= sprintf(\'$ret .= %s($tag_start, $tag_param, $tag_end, $value);\', $this->tags[$tag]);
  177.             eval($parseFun);  
  178.         }  
  179.         $nest --;
  180.         return $ret;  
  181.     }
  182.   /*****************************************************
  183.     * 简单替换,类似变为
  184.     * 标签内容不便,只是替代括号为<>
  185.     *****************************************************/
  186.     function simple($start, $para, $end, $value){
  187.         if (strlen($para) > 0)
  188.           return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
  189.         else
  190.           return sprintf("<%s>%s<%s>", $start, $value, $end);
  191.     }
  192.     /*****************************************************
  193.     * 如下认为合法可以没有“http://”;ftp一定要自己加“ftp://”
  194.     * 93611
  195.     * [/URL]
  196.     * [url]http://www.fogsun.com[/url]
  197.     *****************************************************/
  198.     function url($start, $para, $end, $value){  
  199.         $sA= $value;
  200.         $sURL= substr(trim($para), 1);
  201.         if (strlen($sURL) > 0)
  202.         {
  203.           if (strlen($value) == 0)
  204.             $sA= $sURL;
  205.         }
  206.         else
  207.         {
  208.           $sURL= trim($value);
  209.         }
  210.         $sURL= $this->formatURL($sURL);
  211.         if($this->checkURL($sURL))
  212.           return "[url=%5C%22$sURL%5C%22]$sA";  
  213.         else {
  214.           return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
  215.         }
  216.     }  
  217.     /*****************************************************
  218.     * 如下认为合法可以没有“mailto:”头;
  219.     * pazee
  220.     *
  221.     * [email]pazee@21cn.com[/email]
  222.     *****************************************************/
  223.     function email($start, $para, $end, $value){  
  224.         $sA= $value;
  225.         $sURL= substr(trim($para), 1);
  226.         if (strlen($sURL) > 0)
  227.         {
  228.           if (strlen($value) == 0)
  229.             $sA= $sURL;
  230.         }
  231.         else
  232.         {
  233.           $sURL= trim($value);
  234.         }
  235.         //if (strtolower(substr($sURL, 0, 7)) != "mailto:")  
  236.           $sURL= "mail.php?email=". $sURL;  
  237.         if($this->emailcheck(substr($sURL, 15)))
  238.           return "[url=%5C%22$sURL%5C%22]$sA[/url]";  
  239.         else
  240.           return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
  241.     }  
  242.     /*****************************************************
  243.     * 显示图片;如下用法认为合法
  244.     * [img=www.21cn.com/title.jpg][/img]
  245.     *
  246.     *****************************************************/
  247.     function img($start, $para, $end, $value){  
  248.         $sURL= substr(trim($para), 1);
  249.         if (strlen($sURL) <= 0)
  250.           $sURL= trim($value);
  251.         //$sURL= $this->formatURL($sURL);
  252.         if ($this->checkImgURL($sURL))  
  253.           return sprintf("", $sURL,$sURL);  
  254.         else
  255.           return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
  256.     }  
  257.     /*****************************************************
  258.     * 字符串从右向左循环移动
  259.     * 无参数
  260.     * 等效与html的
  261.     *****************************************************/
  262.     function fly($start, $para, $end, $value){  
  263.       if (strlen($para)>0) // 有参数
  264.         return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
  265.       else
  266.         return \'\'.$value.\'\';  
  267.     }  
  268.     /*****************************************************
  269.     * 字符串来回移动
  270.     * 无参数
  271.     * 等效与html的
  272.     *****************************************************/
  273.     function move($start, $para, $end, $value) {
  274.       if (strlen($para)>0) // 有参数
  275.         return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
  276.       else
  277.         return \'\'.$value.\'\';  
  278.     }  
  279.     /*****************************************************
  280.     * 字符晕光效果包括 glow、shadow和blur
  281.     * 字符晕光效果[glow=a,b,c]或者[shadow=a,b,c]
  282.     * 3个参数允许缺省
  283.     * 实现文字阴影特效,
  284.     * glow, shadow,blur 属性依次为颜色、宽度和边界大小
  285.     * wave 属性依次为变形频率、宽度和边界大小
  286.     *****************************************************/
  287.     function CSSStyle(&$start, &$para, &$end, &$value){
  288.         $rets= sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
  289.         if (strlen($para)==0)
  290.         {
  291.           $para="=,,";
  292.         }
  293.         if (eregi("^=([#]?[[:xdigit:]]{6}|[a-z0-9]*),([0-9]*),([0-9]*)", $para, $er_arr))
  294.         {
  295.           $color=  ($er_arr[1] != "") ? $er_arr[1] : red;   // Default Color
  296.           $width=  ($er_arr[2] != "") ? $er_arr[2] : 400;   // Default Width
  297.           $border= ($er_arr[3] != "") ? $er_arr[3] : 5;     // Default Border
  298.           switch ($start)
  299.           {
  300.             case "glow":
  301.             case "shadow":
  302.               $rets= sprintf("%s", $start, $color, $border, $width, $value);
  303.               break;
  304.             case "blur";
  305.               $rets= sprintf("%s", $start, $border, $color, $width, $value);
  306.               break;
  307.             case "wave":
  308.               $color=  ($er_arr[1] != "") ? $er_arr[1] : 4;   // Default Color
  309.               $border= ($er_arr[3] != "") ? $er_arr[3] : 2;     // Default Border
  310.               $rets= sprintf("%s", $start, $color, $border, $width, $value);
  311.               break;
  312.           }
  313.         }
  314.         return  $rets;
  315.     }  
  316.     /*****************************************************
  317.     * 字体颜色 xxx
  318.     * n 可以是 #xxxxxx 或者 xxxxxx (6位16进制数)
  319.     * red,greed,blue,black等颜色保留字也有效
  320.     * 等效与html的xxx
  321.     * [color]xxxx等效于
  322.     *****************************************************/
  323.     function color($start, $para, $end, $value){
  324.         $cl= strtolower(substr($para, 1));
  325.         if ($cl == "")
  326.           $cl= "red";
  327.         if (eregi("(^[#]?[[:xdigit:]]{6})|red|green|blue|yellow|blue|white|gray|brown|silver|purple|orange" ,$cl))
  328.           return sprintf("%s",$cl, $value);
  329.         else
  330.           return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
  331.     }
  332.     /*****************************************************
  333.     * 字体大小 [size=n]xxx 1<= n <= 7;
  334.     * 等效与html的[size=n]xxx
  335.     *****************************************************/
  336.     function size($start, $para, $end, $value){
  337.         $size= substr($para, 1);
  338.         if ($size >=1 && $size <=7 && (strlen($para) > 1))
  339.           return sprintf("[size=%s]%s",$size, $value);
  340.         else
  341.           return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
  342.     }  
  343.     /*****************************************************
  344.     * 字体名字 [face=n] n字体名称,不需要引号
  345.     * 等效与html的xxx
  346.     *****************************************************/
  347.     function face($start, $para, $end, $value){
  348.         $fn= substr($para, 1);
  349.         if (!eregi("[[:punct:]]", $fn) && strlen($para) > 1) {
  350.           switch (strtoupper($fn))
  351.           {
  352.             case "ST":
  353.               $fn= "宋体";
  354.               break;
  355.             case "HT":
  356.               $fn= "黑体";
  357.               break;
  358.             case "KT":
  359.               $fn= "楷体_GB2312";
  360.               break;
  361.             case "FT":
  362.               $fn= "仿宋_GB2312";
  363.               break;
  364.             case "YY":
  365.               $fn= "幼圆";
  366.               break;
  367.             case "LS":
  368.               $fn= "隶书";
  369.               break;
  370.             case "XST":
  371.               $fn= "新宋体";
  372.               break;
  373.             default:
  374.               $fn= substr($para, 1);
  375.           }
  376.           return sprintf("%s",$fn, $value);
  377.         }
  378.         else
  379.           return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
  380.     }  
  381.      /*****************************************************
  382.     * 文件上传[upload]
  383.     *****************************************************/
  384.     function upload($start, $para, $end, $value){
  385.         $fn= trim(substr($para, 1));
  386.         if (!eregi("[[:punct:]]", $fn) && strlen($para) > 1) {
  387.             if (eregi("jpg|jpeg|bmp|gif|png", $fn)) {
  388.                 if ($this->checkImgURL($value))  
  389.                     return sprintf(" 此主题相关图片如下:


  390. ",$fn,$value,$value);
  391.                 else
  392.                     return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);   
  393.             } elseif ($fn == "swf") {
  394.                 return sprintf(" 此主题相关Flash:


  395. [url=%5C%22%s%5C%22]全屏欣赏[/url] (点右键->另存为可将动画下载)",$fn,$value,$value);
  396.             } elseif (eregi("rar|zip|doc", $fn)) {
  397.                 return sprintf(" [url=%5C%22%s%5C%22]点击下载此主题相关附件[/url]
  398. ",$fn,$value);
  399.             }
  400.         } else
  401.             return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);            
  402.     }     
  403.     /*****************************************************
  404.     * 调试代码标签[html]
  405.     *****************************************************/
  406.     function html($start, $para, $end, $value)

  407.     {
  408.       if (strlen($value) > 0) {
  409.           $value = eregi_replace(\'
  410. \', "", $value);
  411.           return sprintf("
  412. %s
  413. [Ctrl+A 全部选择提示:你可先修改部分代码,再按运行]
  414. ",$value);
  415.       } else {
  416.           return sprintf("[%s]%s[%s]", $start, $value, $end);
  417.       }
  418.     }
  419.     /*****************************************************
  420.     * 引用标签[quote]
  421.     *****************************************************/
  422.     function quote($start, $para, $end, $value)
  423.     {
  424.       if (strlen($value) > 0) {
  425.           return sprintf("



  426. 以下为引用内容:
  427. %s
  428. ",$value);
  429.       } else {
  430.           return sprintf("[%s]%s[%s]", $start, $value, $end);
  431.       }
  432.     }
  433.     /*****************************************************
  434.     * FLASH[swf]
  435.     *****************************************************/
  436.     function swf($start, $para, $end, $value)

  437.     {

  438.       if (strlen($value) > 0) {

  439.           return sprintf ("

  440. [url=%5C%22%s%5C%22]全屏欣赏[/url] (点右键->另存为可将动画下载)",$value,$value);

  441.       } else {

  442.           return sprintf("[%s]%s[%s]", $start, $value, $end);

  443.       }

  444.     }

  445. }  
  446. ?>
复制代码







上一篇:php调用web service方法
下一篇:Smarty缩图函数
authicon nancybingling 发表于 2011-6-18 09:59:58 | 显示全部楼层
支持!好东西,拿走了!
authicon lightning123 发表于 2011-6-22 01:59:44 | 显示全部楼层
看看  好像不错
authicon D_hong 发表于 2011-6-26 11:59:59 | 显示全部楼层
看一下啊,嘻嘻
authicon 月之海洋 发表于 2011-6-27 07:59:54 | 显示全部楼层
这个贴不错!!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-3 07:29

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表