※ 引述《LPH66 (-858993460)》之铭言:
: ※ 引述《aiyswu (绝望客)》之铭言:
: : 各位你们好!
: : 我现在使用的是 phpBB 3.0.8论坛。我的问题是,我有自己特制一个首页,将论坛
: : 的文章捞到前页来;然而,某些文章需要清除BBCode是一个困扰我的问题。
: : BBcode的格式为
: : [url:uid]urlstr[/url:uid]
: : [imgs=num:uid]urlstr[/imgs:uid]
: : [url=urlstr:uid][img:uid]urlstr[/img:uid][/url:uid]
: : 等等..
: : uid为8位英数混合字串
: : 我的作法是
: : $str = preg_replace( '@\[.*?\](.*?)\[\/.*?\]@sm', "$1" ,$bbcodestr );
: : 仍然会漏掉一些BBcode清不掉。
: 你这样等于是把 [ ] 和 [/ ] 一起清
: 那如果是单一个的 [ ] 而没有 [/ ] 的就会清不掉
: : 一位前辈帮我改写了regex
: : $regex = '|[[\/\!]*?[^\[\]]*?]|si';
: | |si
: [[\/\!]*? [ 或 / 或 ! 有0或多个, 不 greedy
: [^\[\]]*? 非 [ 也非 ] 有0或多个, 不 greedy
: ] ]
: 也就是说 逻辑是先抓 [ / ! 的一串 再抓不是 [ ] 的一串 再抓 ]
: 等于是把开始和结束标签一视同仁来抓...
: (不过既然都这样写了那个 ungreedy 的 ? 应该也可以不用才对)
: 话说回来我觉得你的前辈的意思应该是
: $regex = '|\[[\/\!]*?[^\[\]]*?]|si';
: 这样前面的意思就变成了 抓一个 [ 再抓 / ! 的一串 (下略)
: 这样好像比较对....
: : $String = preg_replace($regex, '', $String);
: : 一下就清掉了............
: : 不过我看了很久,却完全看不懂为什么它是这样写?
: : 想请问一下,有没有人可以指点迷津一下呢...
补充一下,*? 也称为 lazy(Regex 圣经 MRE 认为 lazy 效率
不佳尽量少用)
原 po 用 \[.*?\] 还有一个问题是'[]'这样的字串
也会中奖,可是这可能是错的 BBCode,个人建议设计 regex 还是参照
BBCode 的语法设计的精准一点比较好,下面提供另一个范本
(参照原 po 提供的 BBCode)
\[\/?+\w++(=\w++)?+:\w++\]