2014-12-28 37 views
0

我有简单的BBCode解析器:PHP的bbcode解析器[标签]在[标签]

function parse($text) { 
    $text = htmlspecialchars($text); 
    $text = nl2br($text); 
    $text = preg_replace("#\[b\](.*?)\[/b\]#si", '<b>\\1</b>', $text); 
    $text = preg_replace("#\[i\](.*?)\[/i\]#si", '<i>\\1</i>', $text); 
    $text = preg_replace("#\[u\](.*?)\[/u\]#si", '<u>\\1</u>', $text); 
    $text = preg_replace("#\[color=(.*?)\](.*?)\[/color\]#si", "<span style=\"color:\\1;\">\\2</span>", $text); 
//and some more rules [...] 
    return $text; 
} 

它工作的很好,当我有简单的输入,但是当用户在色彩试图用色,它不工作。

例如1:

[b]bold[color=#f00]red[/color][i]italic[/i][/b] 

一切正常,但是当用户尝试像例如2东西:

[b]bold[color=#f00]red[color=#0f0]green[/color][/color][i]italic[/i][/b] 

我的函数返回:

<b>bold<span style="color:#f00;">red[color=#0f0]green</span>[/color]<i>italic</i></b> 
当然例如3

工作良好:

[b]bold[color=#f00]red[/color][color=#0f0]green[/color][i]italic[/i][/b] 

我的问题是任何简单的解决方案来构建像DOM然后解析expresion? 我想要得到这样的示例2:

<b>bold<span style="color:#f00;">red<span style="color:#0f0;">green</span></span><i>italic</i></b> 
+0

的[解析设置高亮的最佳方式]可能重复(HTTP://计算器的.com/q/488963) – mario

回答

1

你应该看看现有的解决方案,如果你愿意来解析复杂的BBCode(见马里奥,以供参考注释链接后)。

不过,如果你愿意坚持使用自己的实现,您可以使用recursive regexes,例如这样:

<?php 
function bbcodeColor($input) 
{ 
    $regex = '#\[color=(.*?)\](((?R)|.)*?)\[\/color\]#is'; 
    if (is_array($input)) { 
     $input = '<span style="color:'.$input[1].';">'.$input[2].'</span>'; 
    } 
    return preg_replace_callback($regex, 'bbcodeColor', $input); 
} 

echo bbcodeColor('[color=#f00]red[color=#0f0]green[/color][/color]'); 
// <span style="color:#f00;">red<span style="color:#0f0;">green</span></span>