2017-03-04 50 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除了这样的输入,你会得到什么结果? –