2014-12-28 3 views
0

У меня есть простой BBCode парсер: хорошо, когда я иметь простой вводPHP BB-парсер [Тег] в [тег]

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

возможно дубликат [Лучший способ разбора BBCode] (HTTP: // StackOverflow .com/д/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>