快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

一个好用的UBB类!

<?php
/*
如有转载,请注明作者

原作者: 何志强
改进:   SonyMusic[sonymusic@163.net]
文件:   ubb.php
备注:   说是改进,其实核心函数parse()已经完全重写了,而且思路也是不相同的。
        不过仍是受何志强的例子的启发,而且测试的例子还有URLCHECK等几个函数也是沿用的何志强的程序,谢谢何志强。
        目前还没有颜色的功能,但我会加入的。
        假如在程序上有什么BUG或不便的地方,请给我MAIL。
        谢谢!
改进功能:
    对字符串进行UBB编码,该类目前只支持下列几个简朴且实用的编码:
    1. URL裢接
       http://phpuser.com/
       http://头可以不需要
       如phpuser.com也是可以的。
    2. Email裢接
       sonymusic@163.net
    3. 图片裢接
       
       同URL链接相同,前面的http也可以不要。
    4. 文字方面
       粗体字
       斜体字
       加下划线
       

1号标题字

...
6号标题字

       
       
       [tt][/tt]
       [s][/s]
       
       [em][/em]
       [strong][/strong]
       [code][/code]
       [samp][/samp]
       [kbd][/kbd]
       [var][/var]
       [dfn][/dfn]
       [cite][/cite]
       
       
       
    注重以下几点:
    1. url,email,img等标签是不分大小写的.
    2. 在标签中不答应有TAB键出现,但空格答应。
    3. 该类要调用htmlencode,htmlencode4textarea,emailcheck函数和urlcheck类.
    4. 修改后支持嵌套,但url,email,img这三个标签不是答应嵌套的。
技术资料:
    Ultimate Bulletin Board
        http://www.ultimatebb.com/
    What is UBB Code
        http://www.scriptkeeper.com/ubb/ubbcode.html
*/

include("urlcheck.php");
include("otherfunc.php"); //这两个文件的内容,附在最后。

//ubbcode类
class ubbcode{
    var $call_time=0;
   //可处理标签及处理函数对应表
   var $tags = array(  //小写的标签 => 对应的处理函数
                       \\'url\\' => \\'$this->url\\',
                       \\'email\\' => \\'$this->email\\',
                       \\'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\\',
                       \\'samp\\' => \\'$this->simple\\',
                       \\'kbd\\' => \\'$this->simple\\',
                       \\'var\\' => \\'$this->simple\\',
                       \\'dfn\\' => \\'$this->simple\\',
                       \\'cite\\' => \\'$this->simple\\',
                       \\'small\\' => \\'$this->simple\\',
                       \\'big\\' => \\'$this->simple\\',
                       \\'blink\\' => \\'$this->simple\\'
                    );
   //url裢接属性
   var $attr_url;
   //url合法性检查对象
   var $urlcheck;

   function ubbcode($attr_url){
      $this->attr_url = \\'\\'.$attr_url;
      $this->urlcheck = new urlcheck();
   }

   //对$str进行UBB编码解析
   function parse($str){
           $this->call_time++;
      $parse = \\'\\'.htmlencode($str);

      $ret = \\'\\';
      while(true){
          $eregi_ret=eregi("/[[#]{0,1}[[:alnum:]]{1,7}/]",$parse,$eregi_arr); //查找[xx]
        if(!$eregi_ret){
            $ret .= $parse;
            break;  //假如没有,返回
         }
         $pos = @strpos($parse,$eregi_arr[0]);
         $tag_len=strlen($eregi_arr[0])-2;//标记长度
        $tag_start=substr($eregi_arr[0],1,$tag_len);
        $tag=strtolower($tag_start);
        
         if((($tag=="url") or ($tag=="email") or ($tag=="img")) and ($this->call_time>1)){
             echo $this->call_time."<br>";
             return $parse;//假如不能是不能嵌套的标记,直接返回
        }
        
         $parse2 = substr($parse,0,$pos);//标记之前
         $parse = substr($parse,$pos+$tag_len+2);//标记之后
         if(!isset($this->tags[$tag])){
             echo "$tag_start<br>";
            $ret .= $parse2.\\'[\\'.$tag_start.\\']\\';
            continue;//假如是不支持的标记
         }
        
         //查找对对应的结束标记
         $eregi_ret=eregi("/[//".$tag."/]",$parse,$eregi_arr);
         if(!$eregi_ret){
            $ret .= $parse2.\\'[\\'.$tag_start.\\']\\';
            continue;//假如没有对应该的结束标记
         }
         $pos=strpos($parse,$eregi_arr[0]);
         $value=substr($parse,0,$pos);//这是起止标记之间的内容
         $tag_end=substr($parse,$pos+2,$tag_len);
         $parse=substr($parse,$pos+$tag_len+3);//结束标记之后的内容
         
         if(($tag!="url") and ($tag!="email") and ($tag!="img")){
             $value=$this->parse($value);
        }

         $ret .= $parse2;
         eval(\\'$ret .= \\'.$this->tags[$tag].\\'("\\'.$tag_start.\\'","\\'.$tag_end.\\'","\\'.$value.\\'");\\');
      }
        $this->call_time--;
      return $ret;
   }

   function simple($start,$end,$value){
      return \\'<\\'.$start.\\'>\\'.$value.\\'</\\'.$end.\\'>\\';
   }

   function url($start,$end,$value){
           $trim_value=trim($value);
        if (strtolower(substr($trim_value,0,7))!="http://")
            $trim_value="http://".$trim_value;
      if($this->urlcheck->check($trim_value)) return \\'<a href="\\'.$trim_value.\\'" \\'.$this->attr_url.\\'>\\'.$value.\\'</a>\\';
      else return \\'[\\'.$start.\\']\\'.$value.\\'[/\\'.$end.\\']\\';
   }

   function email($start,$end,$value){
      if(emailcheck($value)) return \\'<a href="mailto:\\'.$value.\\'">\\'.$value.\\'</a>\\';
      else return \\'[\\'.$start.\\']\\'.$value.\\'[/\\'.$end.\\']\\';
   }

   function img($start,$end,$value){
           $trim_value=trim($value);
        if ((strtolower(substr($trim_value,0,7))!="http://") or ($this->urlcheck->check($trim_value)))
               return \\'<img src="\\'.$trim_value.\\'"></img>\\';
      else return \\'[\\'.$start.\\']\\'.$value.\\'[/\\'.$end.\\']\\';
   }
}

//测试
echo \\'<html>\\';
echo \\'<head><title>测试</title></head>\\';
echo \\'<body>\\';
echo \\'<form action="\\'.str2url($PATH_INFO).\\'" method="post">\\';
echo \\'<textarea cols="100" rows="10" name="ubb">\\'.htmlencode4textarea($ubb).\\'</textarea><br>\\';
echo \\'<input type="submit" value="转变">\\';
echo \\'</form>\\';

if(isset($ubb)){
   $ubbcode = new ubbcode(\\'target="_blank"\\');
   echo \\'<hr>\\'.$ubbcode->parse($ubb);
}

echo \\'</body>\\';
echo \\'</html>\\';

?>

文件urlcheck.php的内容
<?php
//urlcheck.php
class urlcheck{
   var $regex = array(//协议名(注重在这里必须写成小写) => 对应的正则表达式
                      \\'ftp\\' => \\'$this->ftpurl\\',
                      \\'file\\' => \\'$this->fileurl\\',
                      \\'http\\' => \\'$this->httpurl\\',
                      \\'https\\' => \\'$this->httpurl\\',
                      \\'gopher\\' => \\'$this->gopherurl\\',
                      \\'news\\' => \\'$this->newsurl\\',
                      \\'nntp\\' => \\'$this->nntpurl\\',
                      \\'telnet\\' => \\'$this->telneturl\\',
                      \\'wais\\' => \\'$this->waisurl\\'
                     );

   var $lowalpha;
   var $hialpha;
   var $alpha;
   var $digit;
   var $safe;
   var $extra;
   var $national;
   var $punctuation;
   var $reserved;
   var $hex;
   var $escape;
   var $unreserved;
   var $uchar;
   var $xchar;
   var $digits;

   var $urlpath;
   var $password;
   var $user;
   var $port;
   var $hostnumber;
   var $alphadigit;
   var $toplabel;
   var $domainlabel;
   var $hostname;
   var $host;
   var $hostport;
   var $login;

   //ftp
   var $ftptype;
   var $fsegment;
   var $fpath;
   var $ftpurl;

   //file
   var $fileurl;

   //http,https
   var $search;
   var $hsegment;
   var $hpath;
   var $httpurl;

   //gopher
   var $gopher_string;
   var $selector;
   var $gtype;
   var $gopherurl;

   //news
   var $article;
   var $group;
   var $grouppart;
   var $newsurl;

   //nntp
   var $nntpurl;

   //telnet
   var $telneturl;

   //wais
   var $wpath;
   var $wtype;
   var $database;
   var $waisdoc;
   var $waisindex;
   var $waisdatabase;
   var $waisurl;

   function check($url){
      $pos = @strpos($url,\\':\\',1);
      if($pos<1) return false;
      $prot = substr($url,0,$pos);
      if(!isset($this->regex[$prot])) return false;
      eval(\\'$regex = \\'.$this->regex[$prot].\\';\\');
      return ereg(\\'^\\'.$regex.\\'$\\',$url);
   }

   function urlcheck(){
      $this->lowalpha = \\'[a-z]\\';
      $this->hialpha = \\'[A-Z]\\';
      $this->alpha = \\'(\\'.$this->lowalpha.\\'|\\'.$this->hialpha.\\')\\';
      $this->digit = \\'[0-9]\\';
      $this->safe = \\'[$.+_-]\\';
      $this->extra = \\'[*()/\\'!,]\\';
      $this->national = \\'([{}|/^~`]|//[|//])\\';
      $this->punctuation = \\'[<>#%"]\\';
      $this->reserved = \\'[?;/:@&=]\\';
      $this->hex = \\'(\\'.$this->digit.\\'|[a-fA-F])\\';
      $this->escape = \\'(%\\'.$this->hex.\\'{2})\\';
      $this->unreserved = \\'(\\'.$this->alpha.\\'|\\'.$this->digit.\\'|\\'.$this->safe.\\'|\\'.$this->extra.\\')\\';
      $this->uchar = \\'(\\'.$this->unreserved.\\'|\\'.$this->escape.\\')\\';
      $this->xchar = \\'(\\'.$this->unreserved.\\'|\\'.$this->reserved.\\'|\\'.$this->escape.\\')\\';
      $this->digits = \\'(\\'.$this->digit.\\'+)\\';

      $this->urlpath = \\'(\\'.$this->xchar.\\'*)\\';
      $this->password = \\'((\\'.$this->uchar.\\'|[?;&=]\\'.\\')*)\\';
      $this->user = \\'((\\'.$this->uchar.\\'|[?;&=]\\'.\\')*)\\';
      $this->port = $this->digits;
      $this->hostnumber = \\'(\\'.$this->digits.\\'.\\'.$this->digits.\\'.\\'.$this->digits.\\'.\\'.$this->digits.\\')\\';
      $this->alphadigit = \\'(\\'.$this->alpha.\\'|\\'.$this->digit.\\')\\';
      $this->toplabel = \\'(\\'.$this->alpha.\\'|(\\'.$this->alpha.\\'(\\'.$this->alphadigit.\\'|-)*\\'.$this->alphadigit.\\'))\\';
      $this->domainlabel = \\'(\\'.$this->alphadigit.\\'|(\\'.$this->alphadigit.\\'(\\'.$this->alphadigit.\\'|-)*\\'.$this->alphadigit.\\'))\\';
      $this->hostname = \\'((\\'.$this->domainlabel.\\'//.)*\\'.$this->toplabel.\\')\\';
      $this->host = \\'(\\'.$this->hostname.\\'|\\'.$this->hostnumber.\\')\\';
      $this->hostport = \\'(\\'.$this->host.\\'(:\\'.$this->port.\\')?)\\';
      $this->login = \\'((\\'.$this->user.\\'(:\\'.$this->password.\\')?@)?\\'.$this->hostport.\\')\\';

      $this->ftptype = \\'[aidAID]\\';
      $this->fsegment = \\'((\\'.$this->uchar.\\'|[?:@&=])*)\\';
      $this->fpath = \\'(\\'.$this->fsegment.\\'(/\\'.$this->fsegment.\\')*)\\';
      $this->ftpurl = \\'([fF][tT][pP]://\\'.$this->login.\\'(/\\'.$this->fpath.\\'(;[tT][yY][pP][eE]=\\'.$this->ftptype.\\')?)?)\\';

      $this->fileurl = \\'([fF][iI][lL][eE]://(\\'.$this->host.\\'|[lL][oO][cC][aA][lL][hH][oO][sS][tT])?/\\'.$this->fpath.\\')\\';

      $this->search = \\'((\\'.$this->uchar.\\'|[;:@&=])*)\\';
      $this->hsegment = \\'((\\'.$this->uchar.\\'|[;:@&=])*)\\';
      $this->hpath = \\'(\\'.$this->hsegment.\\'(/\\'.$this->hsegment.\\')*)\\';
      $this->httpurl = \\'([hH][tT][tT][pP][sS]?://\\'.$this->hostport.\\'(/\\'.$this->hpath.\\'([?]\\'.$this->search.\\')?)?)\\';

      $this->gopher_string = \\'(\\'.$this->xchar.\\'*)\\';
      $this->selector = \\'(\\'.$this->xchar.\\'*)\\';
      $this->gtype = $this->xchar;
      $this->gopherurl = \\'([gG][oO][pP][hH][eE][rR]://\\'.$this->hostport.\\'(/(\\'.$this->gtype.\\'(\\'.$this->selector.\\'(%09\\'.$this->search.\\'(%09\\'.$this->gopher_string.\\')?)?)?)?)?)\\';

      $this->article = \\'((\\'.$this->uchar.\\'|[;/?:&=])+@\\'.$this->host.\\')\\';
      $this->group = \\'(\\'.$this->alpha.\\'(\\'.$this->alpha.\\'|\\'.$this->digit.\\'|[-.+_])*)\\';
      $this->grouppart = \\'([*]|\\'.$this->group.\\'|\\'.$this->article.\\')\\';
      $this->newsurl = \\'([nN][eE][wW][sS]:\\'.$this->grouppart.\\')\\';

      $this->nntpurl = \\'([nN][nN][tT][pP]://\\'.$this->hostport.\\'/\\'.$this->group.\\'(/\\'.$this->digits.\\')?)\\';

      $this->telneturl = \\'([tT][eE][lL][nN][eE][tT]://\\'.$this->login.\\'/?)\\';

      $this->wpath = \\'(\\'.$this->uchar.\\'*)\\';
      $this->wtype = \\'(\\'.$this->uchar.\\'*)\\';
      $this->database = \\'(\\'.$this->uchar.\\'*)\\';
      $this->waisdoc = \\'([wW][aA][iI][sS]://\\'.$this->hostport.\\'/\\'.$this->database.\\'/\\'.$this->wtype.\\'/\\'.$this->wpath.\\')\\';
      $this->waisindex = \\'([wW][aA][iI][sS]://\\'.$this->hostport.\\'/\\'.$this->database.\\'[?]\\'.$this->search.\\')\\';
      $this->waisdatabase = \\'([wW][aA][iI][sS]://\\'.$this->hostport.\\'/\\'.$this->database.\\')\\';
      $this->waisurl = \\'(\\'.$this->waisdatabase.\\'|\\'.$this->waisindex.\\'|\\'.$this->waisdoc.\\')\\';
   }
}

?>


文件otherfunc.php的内容
<?php
//otherfunc.php
function htmlencode($str){
   $str = (string)$str;

   $ret = \\'\\';
   $len = strlen($str);
   $nl = false;
   for($i=0;$i<$len;$i++){
      $chr = $str[$i];
      switch($chr){
         case \\'<\\':
            $ret .= \\'<\\';
            $nl = false;
            break;
         case \\'>\\':
            $ret .= \\'>\\';
            $nl = false;
            break;
         case \\'"\\':
            $ret .= \\'"\\';
            $nl = false;
            break;
         case \\'&\\':
            $ret .= \\'&\\';
            $nl = false;
            break;
/*
         case \\' \\':
            $ret .= \\' \\';
            $nl = false;
            break;
*/        
         case chr(9):
            $ret .= \\'    \\';
            $nl = false;
            break;
         case chr(10):
            if($nl) $nl = false;
            else{
               $ret .= \\'<br>\\';
               $nl = true;
            }
            break;
         case chr(13):
            if($nl) $nl = false;
            else{
               $ret .= \\'<br>\\';
               $nl = true;
            }
            break;
         default:
            $ret .= $chr;
            $nl = false;
            break;
      }
   }

   return $ret;
}


function htmlencode4textarea($str){
   $str = (string)$str;

   $ret = \\'\\';
   $len = strlen($str);
   for($i=0;$i<$len;$i++){
      $chr = $str[$i];
      switch($chr){
         case \\'<\\':
            $ret .= \\'<\\';
            break;
         case \\'>\\':
            $ret .= \\'>\\';
            break;
         case \\'"\\':
            $ret .= \\'"\\';
            break;
         case \\'&\\':
            $ret .= \\'&\\';
            break;
         case \\' \\':
            $ret .= \\' \\';
            break;
         case chr(9):
            $ret .= \\'    \\';
            break;
         default:
            $ret .= $chr;
            break;
      }
   }

   return $ret;
}

function emailcheck($email){
   $ret=false;
   if(strstr($email, \\'@\\') && strstr($email, \\'.\\')){
      if(eregi("^([_a-z0-9]+([//._a-z0-9-]+)*)@([a-z0-9]{2,}(//.[a-z0-9-]{2,})*//.[a-z]{2,3})$", $email)){
         $ret=true;
      }
   }
   return $ret;
}

function str2url($path){
   return eregi_replace("%2f","/",urlencode($path));
}
?>



返回类别: 教程
上一教程: 关于PHP中操作MySQL数据库的一些要注重的问题
下一教程: php安全之狗尾续貂(转)

您可以阅读与"一个好用的UBB类!"相关的教程:
· 给WIN98下使用APACHE的弟兄们的一个好东西:Apache Manager,不会再有那个DOS窗口了!
· 自己写的一个UBB转变的函数
· 好用的php程序编辑器(要害字带颜色,支持其他文件类型,如htm,java,c等)
· 一个ubbcode的函数,速度很快.
· 一个易用的模板类。
    微笑服务 优质保证 索取样品