2010-09-28 59 views
2

好吧,所以我用一個小設置高亮功能的一個論壇我有,運作良好,因此,如果,例如,我把BB代碼問題PHP

[b]Text[/b] 

它會以粗體打印文本。

我的問題是,如果我有代碼:

[b] 
Text[/b] 

那麼它不會工作,只是打印,因爲它是現在。

這裏是我使用的函數的例子:

function BBCode ($string) { 
$search = array(
    '#\[b\](.*?)\[/b\]#', 
); 
$replace = array(
    '<b>\\1</b>', 
); 
return preg_replace($search , $replace, $string); 
} 

然後echo'ing時:

.nl2br(stripslashes(BBCode($arr_thread_row[main_content]))). 

所以我的問題是,這樣的BBcode工作與什麼是必要的它裏面的一切,但不一定在同一行。

在例如:

[b] 




Text 



[/b] 

,簡直是

文本

感謝您的幫助!

亞歷

+0

我知道我遲到了,但那個正則表達式派上用場我的BBCode風格的PHP。謝謝。 – rybo111 2013-08-11 21:27:56

回答

2

您需要multiline modifier,這使得你的模式類似#\[b\](.*?)\[/b\]#ms

(注意尾隨m

+0

我試過了,但它似乎沒有效果壽,但謝謝你的回覆! – 2010-09-28 01:05:06

+0

@Alex:使用'.'並匹配新行我相信你也需要's'修飾符。 (更新後的帖子) – 2010-09-28 01:06:42

+0

非常感謝! – 2010-09-28 01:16:08

2

其實是有一個pecl extension來解析BB碼,這將是更快,更安全,而不是從頭開始自己寫。

0

我使用這個...它應該工作。

$bb1 = array(
"/\[url\](.*?)\[\/url\]/is", 
"/\[img\](.*?)\[\/img\]/is", 
"/\[img\=(.*?)\](.*?)\[\/img\]/is", 
"/\[url\=(.*?)\](.*?)\[\/url\]/is", 
"/\[red\](.*?)\[\/red\]/is", 
"/\[b\](.*?)\[\/b\]/is", 
"/\[h(.*?)\](.*?)\[\/h(.*?)\]/is", 
"/\[php\](.*?)\[\/php\]/is" 
); 

$bb2 = array(
'<a href="\\1">\\1</a>', 
'<img alt="" src="\\1"/>', 
'<img alt="" class="\\1" src="\\2"/>', 
'<a rel="nofollow" target="_blank" href="\\1">\\2</a>', 
'<span style="color:#ff0000;">\\1</span>', 
'<span style="font-weight:bold;">\\1</span>', 
'<h\\1>\\2</h\\3>', 
'<pre><code class="php">\\1</code></pre>' 
); 

$html = preg_replace($bb1, $bb2, $html); 
+0

非常感謝!這非常有幫助 – 2010-09-28 01:29:22