2014-12-28 41 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>