ホームページ >バックエンド開発 >PHPチュートリアル >bbcode の解析に関する問題 [コード]

bbcode の解析に関する問題 [コード]

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-06-13 12:09:281418ブラウズ

bbcode解析 [code] 的问题

本帖最后由 sky94132003 于 2014-10-30 16:41:28 编辑 之前已问过相关的问题
版主大哥之前已初步解决了
http://bbs.csdn.net/topics/390900798

但后来发觉...如果想帮code加上一个css是不可能的

比如以下的代码
在showBBcodes()中过滤了[code]

但如果数组中加入code来显示代码, 想转义成指定的DIV...那么就会有问题了!

问题二. 如何才能一次性过滤所有function 的[code]?  比如还有 parseSmiley() 和 linkAdd()

有更智能的方法吗?  还是只能在每一个都加上?


代码补上,但因为代码中有出现[ code]  那就不用代码功能贴了抱歉

完整版代码在这:点我

class BBCode {

public function __construct(){}

private function showBBcodes($text) {

$text = htmlspecialchars($text); //编码已存在的 HTML
preg_match_all('#\[code\](.*?)\[/code]#is', $text, $stack);

// BBcode array
$find = array(
'~\[b\](.*?)\[/b\]~s',
'~\[i\](.*?)\[/i\]~s',
'~\[quote\](.*?)\[/quote\]~s',
'~\[code\](.*?)\[/code\]~s'
);

// HTML tags to replace BBcode
$replace = array(
'$1',
            '$1',
            '

$1

',
            '
$1
'
);       

$text = nl2br(preg_replace($find,$replace,$text));
foreach($stack[1] as $t) {
$text = preg_replace('#[ code].*?[/code]#is', $t, $text,1); 
}
return $text;
}


// 表情转义
private function parseSmiley($text){
// スマイリー画像へ
$smileys = array(
':wave:' => 'wave.gif',
':hahaha:' => 'hahaha.gif',
);
//次に、検索と置換
foreach($smileys as $smiley => $img){
$text = str_replace(
$smiley,
"{$smiley} $text
);
}
// 今は返すだけ
$text を返します。    
}

//连结自动加上A标签
private function linkAdd($content){
//引取替换出全部A标签(统一标记<{link}> ;)
preg_match_all('/.*?/i',$content,$linkList);
$ linkList=$linkList[0];
$str=preg_replace('/.*?/i','< ;{link}>',$content);
//引取代替换出全部的IMG标签(统一标记<{img}>)
preg_match_all('/] >/im',$content,$imgList);
$imgList=$imgList[0];
$str=preg_replace('/] >/im',' <{img}>',$str);
//提取代替换出全部的 YOUTUBE 标签(统一标记<{img}>)
preg_match_all('/ ] >/im',$content,$youtubeList);
$youtubeList=$youtubeList[0];
$str=preg_replace('/] >/im', '<{iframe}>',$str);
//提取代替标標準の URL 地址
$str=preg_replace('(((f|ht){1}tp://)[ -a-zA-Z0-9@:%_/ .~#?&//=] )','\0< /a>',$str);
//还原A统一标记為原来的A标签
$arrLen=count($linkList);
for($i=0;$i<$arrLen ;$i ){
$str=preg_replace('/<{link}>/',$linkList[$i],$str,1); 
}
//还原IMG统一标记=原来的IMG标签
        $arrLen2=count($imgList);
for($i=0;$i<$arrLen2;$i ){
$str=preg_replace('/<{img}>/',$ imgList[$i],$str,1); 
}
//还原IMG统一标记は原来的YOUTUBE标签
$arrLen2=count($youtubeList);
for($i=0;$i<$arrLen2;$私){
$str=preg_replace('/<{iframe}>/',$youtubeList[$i],$str,1); 
}
return $str;
}

function noparse( $text = null ) {
$text = str_replace( array( '[', ']' ), array ( '*NoParse1*', '*NoParse2*' ), $text );
return $text;
}

public function parser($message){
$parser_content = $ message;
$parser_content = $this->showBBcodes($parser_content);
$parser_content = $this->parseSmiley($parser_content);
$parser_content = $this->linkAdd($ parser_content);
return $parser_content;
}

}
------解决思路--------------- -------
请给出测试文本和期待的結果