※ 引述《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++\]