0

0

bbcode解析时遇见的两个问题!

php中文网

php中文网

发布时间:2016-06-23 13:48:03

|

1168人浏览过

|

来源于php中文网

原创

网上一直没找到合适的bbcode解析类
所以东抄西抄的做了一个
但是出现两问题了,请各位高手协助一下。

代码在最下

问题一:bbcode解析时遇到[code][/code]不做任何处理...比如表情/其他bbcode等不转义

问题二:如何过滤HTML?
我用BBCODE保存资料就是不想用户用HTML.....

但我测试时...发现如何手动输入:

<div style="color:red">dddd</div>


竟然能真的有效


所以如果是插入一些js或者iframe应该也是可以的吧?

有什么方法可方止?

下面提供整个class 代码, 刚开始, 东抄西抄组装,还没优化好,请见谅


<?phpclass BBCode {      public function __construct(){}    private function showBBcodes($text) {        // BBcode array        $find = array(            '~[b](.*?)[/b]~s',            '~[i](.*?)[/i]~s',            '~[u](.*?)[/u]~s',            '~[quote](.*?)[/quote]~s',            '~[table](.*?)[/table]~s',            '~[tr](.*?)[/tr]~s',            '~[td](.*?)[/td]~s',            '~[justify](.*?)[/justify]~s',            '~[center](.*?)[/center]~s',            '~[right](.*?)[/right]~s',            '~[left](.*?)[/left]~s',            '~[size=(.*?)](.*?)[/size]~s',            '~[color=(.*?)](.*?)[/color]~s',            '~[font=(.*?)](.*?)[/font]~s',            '~[url=((?:ftp|https?)://.*?)](.*?)[/url]~s',            '~[img](https?://.*?.(?:jpg|jpeg|gif|png|bmp))[/img]~s',            '/[img=(d+)x(d+)](.*?)[/img]/is',            '~[youtube](.*?)[/youtube]~s',        );        // HTML tags to replace BBcode        $replace = array(            '<b>$1</b>',            '<i>$1</i>',            '<span style="text-decoration:underline;">$1</span>',            '<pre class="brush:php;toolbar:false;">$1</'.'pre>',            '<table>$1</table>',            '<tr>$1</tr>',            '<td>$1</td>',            '<div align="justify">$1</div>',            '<div align="center">$1</div>',            '<div align="right">$1</div>',            '<div align="left">$1</div>',            '<span class="h$1">$2</span>',            '<span style="color:$1;">$2</span>',            '<span style="font:$1;">$2</span>',            '<a href="$1" target="_blank" rel="nofollow">$2</a>',            '<img src="$1" alt=""/>',            '<img width="$1" height="$2" src="$3" alt="" />',            '<iframe width="560"    style="max-width:90%" src="http://www.youtube.com/embed/$1?wmode=opaque" data-youtube-id="$1" frameborder="0" allowfullscreen=""></iframe>'        );        return nl2br(preg_replace($find,$replace,$text));    }    //表情转义    private function parseSmiley($text){        // Smiley to image        $smileys = array(            ':wave:' => 'wave.gif',            ':hahaha:' => 'hahaha.gif',            ':hahahau:' => 'hahahau.gif',            ':help:' => 'help.gif'        );        // Now you need find and replace        foreach($smileys as $smiley => $img){            $text = str_replace(                    $smiley,                "<img src='{$img}' alt='{$smiley}'/>",                $text            );        }        // Now only return it        return $text;        }    //为连结自动加上A标签    private function linkAdd($content){        //提取替换出所有A标签(统一标记<{link}>)        preg_match_all('/<a.*?href=".*?".*?>.*?</a>/i',$content,$linkList);        $linkList=$linkList[0];        $str=preg_replace('/<a.*?href=".*?".*?>.*?</a>/i','<{link}>',$content);        //提取替换出所有的IMG标签(统一标记<{img}>)        preg_match_all('/<img [^ alt="bbcode解析时遇见的两个问题!" >]+>/im',$content,$imgList);        $imgList=$imgList[0];        $str=preg_replace('/<img [^ alt="bbcode解析时遇见的两个问题!" >]+>/im','<{img}>',$str);        //提取替换出所有的YOUTUBE标签(统一标记<{img}>)        preg_match_all('/<iframe[^>]+>/im',$content,$youtubeList);        $youtubeList=$youtubeList[0];        $str=preg_replace('/<iframe[^>]+>/im','<{iframe}>',$str);        //提取替换标准的URL地址        $str=preg_replace('(((f|ht){1}tp://)[-a-zA-Z0-9@:%_/+.~#?&//=]+)','<a href="\0" target="_blank" rel="nofollow">\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;$i++){            $str=preg_replace('/<{iframe}>/',$youtubeList[$i],$str,1);         }        return $str;    }    public function parser($message){        $parser_content = $message;        $parser_content = $this->showBBcodes($parser_content);        $parser_content = $this->linkAdd($parser_content);        $parser_content = $this->parseSmiley($parser_content);        return $parser_content;    }}


回复讨论(解决方案)

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

         //原来的数组赋值

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

大哥,谢谢提醒
竟然忘了 htmlspecialchars 


但有关[code]

           $text = preg_replace('#[code].*?

#is', $t, 1); [/code]
这样不知为什么不行,只要整篇内容有包含 [code]...就整篇内容变成 "1" 

后来改成 :

           $text = preg_replace('#[code].*?

#is', $t, $text); [/code]

改这样
有没有什么大问题吗?

短视频去水印微信小程序
短视频去水印微信小程序

抖猫高清去水印微信小程序,源码为短视频去水印微信小程序全套源码,包含微信小程序端源码,服务端后台源码,支持某音、某手、某书、某站短视频平台去水印,提供全套的源码,实现功能包括:1、小程序登录授权、获取微信头像、获取微信用户2、首页包括:流量主已经对接、去水印连接解析、去水印操作指导、常见问题指引3、常用工具箱:包括视频镜头分割(可自定义时长分割)、智能分割(根据镜头自动分割)、视频混剪、模糊图片高

下载

$text = preg_replsce('#[code].*?[/code]#is', $t,  $text, 1); 
不好意思,写漏了

不知为什么出不了代码
本代大哥你提供的是

           $text = preg_replace('#[code].*?[/code]#is', $t, 1); 


这样不知为什么不行,只要整篇内容有包含 [code]...就整篇内容变成 "1" 

要改成
           $text = preg_replace('#[code].*?[/code]#is', $t, $text); 

才能用

请教下这样会有大问题吗?

$text = preg_replsce('#[code].*?[/code]#is', $t,  $text, 1); 
不好意思,写漏了

原来这样
明白
太感谢了

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

616

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

194

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

91

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

54

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

598

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

56

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 5.3万人学习

R 教程
R 教程

共45课时 | 6.9万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号