/*****************************************************
    * 如下认为合法可以没有“http://”;ftp一定要自己加“ftp://”
    * 93611
    * http://www.fogsun.com
    * 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 "<a href=\"$sURL\">$sA</a>";  
        else {
          return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
        }
    }  
        /*****************************************************
    * 如下认为合法可以没有“mailto:”头;
    * [[email protected]]pazee[/email]
    * [[email protected]][/email]
    * [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= "mailto:". $sURL;  
        if($this->emailcheck(substr($sURL, 7))) 
          return "<a href=\"$sURL\">$sA</a>";  
        else
          return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
    }  
        /*****************************************************
    * 显示图片;如下用法认为合法
    * 
    * 
    *****************************************************/
    function img($start, $para, $end, $value){  
        $sURL= substr(trim($para), 1);
        if (strlen($sURL) <= 0) 
          $sURL= trim($value);
        $sURL= $this->formatURL($sURL);
        if ($this->checkImgURL($sURL))  
          return sprintf("<img src=\"%s\"></img>", $sURL);  
        else
          return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
    }      /*****************************************************
    * 字符串从右向左循环移动 
    * 无参数
    * 等效与html的<marquee>
    *****************************************************/
    function fly($start, $para, $end, $value){  
      if (strlen($para)>0) // 有参数
        return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
      else
        return '<marquee behavior=alternate scrolldelay=100>'.$value.'</marquee>';  
    }  
    
    /*****************************************************
    * 字符串来回移动 
    * 无参数
    * 等效与html的<marquee>
    *****************************************************/
    function move($start, $para, $end, $value) {
      if (strlen($para)>0) // 有参数
        return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
      else
        return '<marquee  scrolldelay=100>'.$value.'</marquee>';  
    }  
        /*****************************************************
    * 字符晕光效果包括 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("<font style=\"FILTER: %s(Color =%s,Strength=%s); width:%s\">%s</font>", $start, $color, $border, $width, $value);
              break;
            case "blur";
              $rets= sprintf("<font style=\"FILTER: %s(Strength=%s);color:%s; width:%s\">%s</font>", $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("<font style=\"FILTER: %s(Freq=%s, Strength=%s); width:%s\">%s</font>", $start, $color, $border, $width, $value);
              break;
          }
        }
        return  $rets;
    }  

解决方案 »

  1.   


        /*****************************************************
        * 字体颜色 xxx 
        * n 可以是 #xxxxxx 或者 xxxxxx (6位16进制数)
        * red,greed,blue,black等颜色保留字也有效
        * 等效与html的<font color=n>xxx</font>
        * [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" ,$cl)) 
              return sprintf("<font color=%s>%s</font>",$cl, $value);
            else
              return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
        }  
        /*****************************************************
        * 字体大小 [size=n]xxx[/size] 1<= n <= 7;
        * 等效与html的<font size=n>xxx</font>
        *****************************************************/
        function size($start, $para, $end, $value){
            $size= substr($para, 1);
            if ($size >=1 && $size <=7 && (strlen($para) > 1))
              return sprintf("<font size=%s>%s</font>",$size, $value);
            else
              return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
        }  
        /*****************************************************
        * 字体名字 [face=n] n字体名称,不需要引号
        * 等效与html的<font face=n>xxx</font>
        *****************************************************/
        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;
              }
              return sprintf("<font face=\"%s\">%s</font>",$fn, $value);
            }
            else
              return sprintf("[%s%s]%s[%s]", $start, $para, $value, $end);
        }  
        
        /*****************************************************
        * 返回UBB解释器的版本和最后修改日期
        *****************************************************/
        function  GetUBBVer(&$sVer, &$sLastMod) 
        {
          $sVer= sVersion;
          $sLastMod= $this->$sLastModified;
          return $sVer;
      }
    }  
    /**************************** UPDATE LOG *********************************
    2001.12.31 实现基本完整的UBB标签支持功能
               增加对若干标签的支持,比如face, size, color等
    2001.01.04 增加了对图片URL的扩展名称检查,支持gif,bmp,pcx,tiff,png,jpg,jpeg,tga,lwf文件
               增加了自动补全URL协议部分的函数,支持http,fpt,gopher,finger,bbs,telnet等等
               允许\\和//的等效,
    2002.01.07 修改了[face=]的显示错误,增加中文字体缩写
    2002.01.08 完善了[glow]标签函数,增加了默认值,允许函数有缺省
               增加了[shadow]标签,使用方法和[glow]类似,并允许叠加效果
    2002.01.09 增加了[wave][blur]标签函数,
               使用方法和[glow]类似,并允许叠加效果
    2002.01.15 修改了正则表达式的匹配字符串,因为 可能出现=_"'等这些字符,
               但是使用[url]xxxxx
    就不会有问题,原来没考虑到;
               FormatURL增加了对mms协议的支持,现在media player的格式很多;
               增加版本函数,可以返回UBB解释器的版本和最后修改日期
    **************************************************************************/
    ?>
      

  2.   

    把以上的内容合并成 ubbcode.php下面这段是个测试文件<?php  
        //测试  
        include ("./ubbcode.php");
        printf("<html>\n");  
        echo "<head><title>UBB代码测试</title></head>\n";  
        echo "<body style =\"FONT-SIZE: 9pt; FONT-FAMILY: 宋体\">\n";  
        echo "<marquee scrolldelay=20>UBB表达式测试页</marquee>\n";
        $ubbcode = new ubbcode();  
        $ubbcode->GetUBBVer($sVer, $sLastMod);
        printf("<br>\n    版本:%s<br>\n最后修订日期:%s<br>", $sVer, $sLastMod);
        echo "<form action=".($PATH_INFO)." method=post>\n";  
        echo "<textarea  name=ubb style=\"width:95%; height:140px\">".stripslashes($ubb)."</textarea><br>\n";  
        echo "<input type=submit value=转换>\n";  
        echo "</form>\n"; 

        if(isset($ubb)){  
           echo "<hr>\n".$ubbcode->parse(stripslashes(nl2br($ubb)));  
        }  

        echo "</body>\n";  
        echo "</html>\n";  
    ?>大家可在这里测试效果
    http://our93611.51.net/ubb/ubb.php这里时说明
    http://our93611.51.net/ubb/ubbintro.htm按照写个规则,大家很容易写出来支持flash,mid,wma等等的新的ubb函数。