/*

如有转载,请注明作者

作者: 何志强

文件: ubb.php

备注: 说是改进,其实核心函数parse()已经完全重写了,而且思路也是不一样的。

不过仍是受何志强的例子的启发,而且测试的例子还有urlcheck等几个函数也是沿用的何志强的程序,谢谢何志强。

目前还没有颜色的功能,但我会加入的。

如果在程序上有什么bug或不便的地方,请给我mail。

谢谢!

改进功能:

对字符串进行ubb编码,该类目前只支持下列几个简单且实用的编码:

1. url裢接

http://www.phpexe.com/

http://头可以不需要

如phpexe.com也是可以的。

2. email裢接

demo@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.”
”;

return $parse;//如果不能是不能嵌套的标记,直接返回

}

$parse2 = substr($parse,0,$pos);//标记之前

$parse = substr($parse,$pos+$tag_len+2);//标记之后

if(!isset($this->tags[$tag])){

echo “$tag_start
”;

$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 <.>.$value.;

}

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 attr_url.>.$value.;

else return [.$start.].$value.[/.$end.];

}

function email($start,$end,$value){

if(emailcheck($value)) return .$value.;

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 ;

else return [.$start.].$value.[/.$end.];

}

}

//测试

echo ;

echo

测试;

echo

;

echo

;

echo .htmlencode4textarea($ubb).
;

echo ;

echo

;

if(isset($ubb)){

$ubbcode = new ubbcode(target=”_blank”);

echo


.$ubbcode->parse($ubb);

}

echo ;

echo ;

?>

文件urlcheck.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的内容

//otherfunc.php

function htmlencode($str){

$str = (string)$str;

$ret = ;

$len = strlen($str);

$nl = false;

for($i=0;$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 .=
;

$nl = true;

}

break;

case chr(13):

if($nl) $nl = false;

else{

$ret .=
;

$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

$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 ubb类,一个用PHP实现的UBB类!-PHP教程,PHP应用相关推荐

  1. java图片缩放工具类,一个JAVA图形缩放处置工具类

    一个JAVA图形缩放处理工具类 调用的例子 import java.io.FileOutputStream; import java.io.IOException; import javax.imag ...

  2. php access类,一个简洁的PHP操作Access类

    /* FileName:cls_access.php Summary: Access数据库操作类 ************************************* 使用范例: ======= ...

  3. php pdo oracle操作类,一个基于PDO的数据库操作类

    百度之后决定使用PDO,至于为什么选择PDO,这里就不再多说,大家自己去百度下就能明白. 既然要换,那最基本就需要有个常用的数据库操作类,也就是所谓的增删改查等,昨晚捣腾了一晚,大致弄出了个雏形,以下 ...

  4. Python中的元编程:一个关于修饰器和元类的简单教程

    作者 | Saurabh Kukade 译者 | 刘畅 出品 | AI科技大本营(ID:rgznai100) 最近,作者遇到一个非常有趣的概念,它就是用 Python 进行元编程.我想在本文中分享我对 ...

  5. 一个java的DES加解密类转换成C#

    原文:一个java的DES加解密类转换成C# 一个java的des加密解密代码如下: //package com.visionsky.util;import java.security.*; //im ...

  6. 一个好用的ODBC数据库类CMYODBC

    一个好用的ODBC数据库类CMYODBC 一.引言 感觉MFC的CRecordset类不是很好用,因为我们要想使用的话必须为每个查询从CRecordset类派生出一个新类,或者进行动态数据交换.在VC ...

  7. 编写代码,实现一个栈(Stack)的类。

    编写代码,实现一个栈(Stack)的类. 栈是只能在一端插入和删除数据的序列.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被 ...

  8. python定义一个类描述数字时钟_python自定义时钟类、定时任务类

    这是我使用python写的第一个类(也算是学习面向对象语言以来正式写的第一个解耦的类),记录下改进的过程. 分析需求 最初,因为使用time模块显示日期时,每次都要设置时间字符串的格式,挺麻烦,但还是 ...

  9. 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil

    基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...

  10. python property方法_Python——property(使一个方法看起来就像类属性一样)

    """ 装饰器property: 使一个方法看起来就像类属性一样 """ #例子1 class A: def __init__(self, ...

最新文章

  1. 5.java String对象
  2. STC89C52单片机 LED灯闪烁
  3. 修改计算机用户权限,如何修改一个电脑账户为最低权限
  4. Vue cli3.0创建Vue项目
  5. [css] css中最常用的字体有哪些?你是怎么选择字体的?
  6. 上交大计算机复试机师难不难,本科复旦,考研上海交大复试第一,我感觉难度并不大...
  7. jsp 或 php 等view之中使用javascript简单处理的使用技巧
  8. 用实力给自己正名,YOLOv5:道路损伤检测我最强!GRDDC'2020大赛报告
  9. 181104每日一句
  10. Proxyee Down百度网盘高速下载器详细使用教程
  11. 表格标签-表格基本结构
  12. 这内容感觉不咋滴,啊咧怎么就十万+了?
  13. 基于python的饭店点餐外卖管理系统#毕业设计
  14. 经典贪吃蛇大战逆向_游戏内购
  15. 计算机语言替换,Zig 0.7.0 发布,想要替换 C的编程语言
  16. imToken安卓版下载
  17. 领域驱动设计,为何又死灰复燃了?
  18. html 进入页面延迟加载数据,跳转至预加载的页面后数据显示延迟问题
  19. 电机编码器调零步骤_各种编码器调零方法
  20. JvisualVM使用教程

热门文章

  1. Unity获取物体下的子物体+只获取子物体
  2. dubbo 报错 com.alibaba.com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:408)
  3. photoshop 抠图
  4. pdf转换成jpg python_Python Wand将PDF转换为JPG background
  5. ElasticSearch 7.7.0 高级篇-搜索技术
  6. java报错establishing_[Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket错误解决方法总结...
  7. echarts中中国地图飞机路线使用
  8. 列举5种常见的计算机硬件主要有哪些,计算机硬件组成有哪些
  9. pg_stat_statements
  10. JavaScript中三元一次函数的解法