ホームページ > php教程 > php手册 > PHP で実装された UBB クラス!

PHP で実装された UBB クラス!

WBOY
リリース: 2016-06-21 09:15:22
オリジナル
1769 人が閲覧しました

ウブ

/*
転載がある場合は作者を明記してください

著者: He Zhiqiang
ファイル: ubb.php
注: 改善と言われていますが、実際にはコア関数 parse()完全に書き直されており、アイデアも同様に異なります。
ただし、それでも He Zhiqiang の例からインスピレーションを受けており、テスト例や URLCHECK などのいくつかの関数も He Zhiqiang のプログラムに従っています。ありがとう、He Zhiqiang さん。
カラー機能はまだありませんが、追加していきます。
プログラムにバグや不都合がある場合は、メールでお知らせください。
ありがとう!
機能の改善:
文字列の UBB エンコーディング。このクラスは現在、次の単純で実用的なエンコーディングのみをサポートしています:
1. URL リンク
http://www.phpexe.com/
http:// ヘッダーは OK 必要ありません
たとえば、phpexe.com も使用できます。
2. 電子メールのリンク
デモ@163.net
3. 画像のリンク

URL リンクと同様に、前の http はオプションです。
4. 本文
太字
イタリック
下線

タイトル単語 No. 1
...
タイトル単語 No. 6



[tt][/tt]
[s][/ s]

[em ][/em]
[strong][/strong]

[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 の 3 つのタグはネストできません。
技術情報:
究極の掲示板
http://www.ultimatebb.com/
UBB コードとは
http://www.scriptkeeper.com/ubb/ubbcode.html
*/

include("urlcheck. php");
include("otherfunc.php"); //これら 2 つのファイルの内容は最後に添付されます。

//ubbcode class
class ubbcode{
var $call_time=0;
//扱えるタグと処理関数の対応表
var $tags = array( //小文字のタグ => 対応する処理関数
'url ' = > '$this->url'、
'メール' => '$this->メール'、
'img' => 'b' = > '$this->シンプル'、
'i' => '$this->シンプル'、
'u' => '$this->シンプル'、
'tt' => this->simple'、
's' => '$this->simple'、
'strike' => '$this->simple'、
'h1' => >シンプル'、
'h2' => '$this->シンプル'、
'h3' => '$this->シンプル'、
'h4' =>シンプル'、
'h5' => '$this->シンプル'、
'h6' => '$this->シンプル'、
'sup' => 、
'サブ' => '$this->シンプル'、
'em' => '$this->シンプル'、
'コード' => '$this->シンプル'、
'samp' => '$this->シンプル'、
'kbd' => '$this->シンプル'、
'var ' => '$this->シンプル'、
'dfn' => '$this->シンプル'、
'cite' => '$this->シンプル'、
' = > '$this->simple',
'big' => '$this->simple',
'blink' => '$this->simple'
// URL 添付ファイル属性
var $attr_url;
//URL 正当性チェック オブジェクト
var $urlcheck;

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

// $str の UBB エンコード解析
関数 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; // そうでない場合は、 return
}
$pos = @strpos($parse,$eregi_arr[0]) ;
$tag_len=strlen($eregi_arr[0])-2;//タグの長さ
$tag_start=substr($eregi_arr[0],1,$tag_len);

if((($tag=="url") または ($tag=="email") または ($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< br> ";
$ret .= $parse2.'['.$tag_start.']';
continue;// サポートされていないタグの場合
}

// 対応する終了タグを検索
$eregi_ret=eregi ( "[/".$tag."]",$parse,$eregi_arr);
if(!$eregi_ret){
$ret .= $parse2.'['.$tag_start.']'; / /対応する終了タグがない場合
}
$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") および ($tag!="email") および ($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.''
}

関数 url($start,$end,$value){
$trim_value=trim($値) ;
if (strto lower(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.']'
}

関数 email($start,$end,$value){
if(emailcheck( $value )) return ''.$value.'';
else return '['.$start.']'。 $value .'[/'.$end.']';
}

関数 img($start,$end,$value){
$trim_value=trim($value) if ((strto lower(substr( $trim_value ,0,7))!="http://") または ($this->urlcheck->check($trim_value)))
return '';
else return '['.$start.']'.$value.'[/'.$end.']';
}
}

//テスト
echo '';
echo 'test

';
echo '';
echo '
';
echo ''.htmlencode4textarea($ubb).'< ; /textarea>
';
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',
  'ファイル' => '$this->fileurl'、
'http' => '$this->httpurl'、
'https' => '$this->httpurl',
'gopher' => '$this->gopherurl'、
'ニュース' => '$this->ニュースurl'、
'nntp' => '$this->nntpurl'、
'telnet' => '$this->telneturl',
'wais' => '$this->waisurl'
);

var $lowalpha;
var $hialpha;
var $alpha;
var $digit;
var $safe;
var $extra;
var $national;
var $句読点;
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 $alphadigital;
var $toplabel;
var $domainlabel;
var $hostname;
var $host;
var $hostport;
var $login;

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

//ファイル
var $fileurl;

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

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

//ニュース
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;

関数 check($url){
$pos = @strpos($url,':',1);
if($pos $prot = substr($url,0,$pos);
if(!isset($this->regex[$prot])) 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->句読点 = '[<>#%"]';
$this->予約 = '[?;/:@&=]';
$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->未予約.'|'.$this->予約.'|'.$this->escape.')'
$this->digits = '('.$this->数字.'+)';

$this->urlpath = '('.$this->xchar.'*)';
$this->パスワード = '(('.$this-> uchar.'|[?;&=]'.')*)';
$this->user = '(('.$this->uchar.'|[?;&=]'.') *)';
$this->ポート = $this->数字;
$this->ホスト番号 = '('.$this->数字.'.'.$this->数字.' .'.$this->数字.'.'.$this->数字.')'
$this->alphadigit = '('.$this->alpha.'|'.$this ->数字.')';
$this->toplabel = '('.$this->alpha.'|('.$this->alpha.'('.$this->alphadigital) .'|-)*'.$this->英数字.'))';
$this->domainlabel = '('.$this->alphadigit.'|('.$this->alphadigit.'('.$this->alphadigit.'|-)*'.$ this->英数字。'))';
  $this->ホスト名 = '(('.$this->ドメインラベル.'\.)*'.$this->トップラベル.')';
$this->host = '('.$this->ホスト名.'|'.$this->ホスト番号.')';
$this->hostport = '('.$this->host.'(:'.$this->port.')?)';
$this->login = '(('.$this->user.'(:'.$this->パスワード.')?@)?'.$this->ホストポート.')' ;

$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->ホストポート.'(/'.$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->ホストポート.'(/('.$this-> ;gtype.'('.$this->selector.'(%09'.$this->search.'(%09'.$this->gopher_string.')?)?)?)?) ?)';

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

$this->nntpurl = '([nN][nN][tT][pP]://'.$this->ホストポート.'/'.$this->グループ.'(/' .$this->数字.')?)';

$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->ホストポート.'/'.$this->データベース.'/'.$ this->wtype.'/'.$this->wpath.')';
$this->waisindex = '([wW][aA][iI][sS]://'.$this->ホストポート.'/'.$this->データベース.'[?]' .$this->検索。')';
$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<$len;$i++){
$chr = $str[$i];
switch($chr){
case '<':
$ret .= '<';
$nl = false;
休憩;
case '>':
$ret .= '>';
$nl = false;
休憩;
case '"':
$ret .= '"';
$nl = false;
休憩;
ケース '&':
$ret .= '&';
$nl = false;
休憩;
/*
case ' ':
$ret .= ' ';
$nl = false;
休憩;
*/
case chr(9):
$ret .= ' ';
$nl = false;
休憩;
case chr(10):
if($nl) $nl = false;
else{
$ret .= '
';
$nl = true;
}
休憩;
ケース chr(13):
  if($nl) $nl = false;
else{
$ret .= '
';
$nl = true;
}
休憩;
デフォルト:
$ret .= $chr;
$nl = false;
休憩;
}
}

return $ret;
}


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

$ret = '';
$len = strlen($str);
for($i=0;$i $chr = $str[$i];
switch($chr){
case '<':
$ret .= '<';
休憩;
case '>':
$ret .= '>';
休憩;
case '"':
$ret .= '"';
休憩;
ケース '&':
$ret .= '&';
休憩;
case ' ':
$ret .= ' ';
休憩;
case chr(9):
$ret .= ' ';
休憩;
デフォルト:
$ret .= $chr;
休憩;
}
}

return $ret;
}

関数 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})$", $メール)){
$ret=true;
}
}
return $ret;
}

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



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート