2017-03-04 38 views
1
$regex = '/\[b\](.*?)\[\/b\]/is'; 

    $string = '[b][b][b]string[/b][/b][/b]'; 

重複匹配這將只匹配直到第一個[/ B],因此,如果我用這個正則表達式來此的bbcode轉換爲HTML我將結束與此:內匹配

string[/b][/b] 

我m使用PHP preg_replace,我如何才能最終得到string,所以有3個html bold標籤。

+0

也許'\並[b \(\ /)〕''與'<$1strong>此不檢查匹配配對雖然..這將與str_replace(array('[b]','[/ b]'),數組('','')' – chris85

+0

一樣嗎? [(\/| | b \]'到'<$1b>')? – horcrux

+1

您可以重複替換,直到沒有任何其他內容匹配。 – apokryfos

回答

3

對於這樣髒的情況:

this [b]is [b]a[/b][/b] test [b]string[/b] 

遞歸解決方案的工作:

\[b](?:(?:(?!\[b]).)*?|(?R))*\[/b] 

Live demo

PHP代碼:

$str = 'this [b]is [b]a[/b][/b] test [b]string[/b]'; 

echo preg_replace_callback('~\[(\w+)](?:(?:(?!\[\1]).)*?|(?R))*\[/(\1)]~', function($m) { 
    return "**".preg_replace("~\[/?$m[1]]~", '', $m[0])."**"; 
}, $str); 

輸出:

this **is a** test **string** 
+0

在regex101的現場演示中,如果您點擊pcre風味,則會因爲上一次斜槓而顯示'圖案錯誤'。可以通過反斜槓來修復。謝謝。 – MohaMad

+0

我相信你沒有仔細看過我提供的現場演示。 (它已經在PCRE的味道了)@MohaMad – revo

+0

我知道,這是regex101錯誤!嘗試點擊pcre或將其更改爲javascript並返回pcre,請@revo – MohaMad

1

您可以使用非捕獲組延長重複計數:

(?:\[b\])+(.*?)(?:\[\/b\])+ 
^^^  ^^  ^^^  ^^ 

demo

+0

有沒有一種方法可以處理這樣的字符串:[b] [b] [b]字符串[/ b] string [/ b] string [/ b] – Vixxs

+0

@revo我不確定BBCode能否提供這種衝突,是嗎? –

+0

@Vixxs除了這樣的輸入,你會得到什麼結果? –