2010-07-09 23 views
0

Je fais mon propre analyseur bbcode, et j'ai un problème quand j'essaie de faire la citation récursive.PHP - BBCode parser - récursif [quote] avec regex et preg_replace

ceci est mon code:

function forumBBCode($str){ 
$format_search=array(
'#\[quote=(.*?)\](.*?)\[/quote\]#is' 
); 

$format_replace=array(
'<blockquote class="quotearea"><i><a class="lblackbu" href="./index.php?status=userview&userv=$1">$1</a> wrote :</i><br />$2</blockquote>' 
); 

$str=preg_replace($format_search, $format_replace, $str); 
$str=nl2br($str); 
return $str; 
} 

ce que je dois ajouter/modifier pour faire une citation récursive? en d'autres termes, quand une citation se trouve dans une autre citation ...

acclamations et TNX pour l'aide

+1

C'est assez difficile si vous êtes nouveau dans les expressions régulières. Les expressions rationnelles récursives sont délicates, donc la plupart des gens optent pour le drapeau d'évaluation/e et ont en fait la descente de l'analyseur "regex" dans le contenu inclus. Quoi qu'il en soit, lisez d'abord http://www.regular-expressions.info/ - c'est une meilleure introduction que le manuel PHP. – mario

+0

je vais apprendre ce guide et je vais essayer de faire une fonction :) je vous le ferai savoir, j'espère que vous pouvez m'aider de toute façon! tnx !!! – markzzz

+0

Je pense que vous avez deux façons de résoudre cela: a) parcourir le contenu et rechercher les guillemets d'ouverture et de fermeture et les remplacer si les deux sont trouvés (laissez le reste comme bbcode visible) ou b) utiliser 'preg_replace_callback()' qui s'appelle à nouveau si une balise de devis imbriquée a été trouvée. – mgutt

Répondre

4

C'est un vieux Q mais je vais poster ma solution de toute façon pour ppl =]

$open = '<blockquote><span class="bold">Quote: </span><br />'; //the next few lines do the parsing for quote blocks. We 
     $close = '</blockquote>';          //have to do it outside the normal parsing arrays because that way does not allow nesting. 

     preg_match_all ('/\[quote\]/i', $str, $matches); 
     $opentags = count($matches['0']); 

     preg_match_all ('/\[\/quote\]/i', $str, $matches); 
     $closetags = count($matches['0']); 

     $unclosed = $opentags - $closetags; 
     for ($i = 0; $i < $unclosed; $i++) { 
       $str .= '</blockquote>'; 
     } 
//Do Quotes (nested) 
     $str = str_replace ('[quote]', $open, $str); 
     $str = preg_replace('/\[quote\=(.*?)\]/is','<blockquote class="darkbg"><span class="bold left">Quote: $1</span><br />', $str); 
     $str = str_replace ('[/quote]', $close, $str); 
return $str; 

paix.

+2

Vous avez pris soin des étiquettes non fermées. Et si les non-ouverts existent aussi? – wolo