2013-07-23 4 views
1

J'écris actuellement une fonction en PHP pour traduire BBCodes pour un moteur de forum. Maintenant, je voulais ajouter un [code] -tag et moi avons créé la fonction suivante:preg remplacer plusieurs résultats

$txt = preg_replace('#\[code\](.*)\[(.*)\[/code\]#isU', "<div class=\"bb_uncode\">$1&#91;$2</div>", $txt); 

(Side note: &#91; égaux [)
Cela fonctionne très bien s'il n'y a qu'un seul [ dans le code [] -tags , mais il ignore tous les autres.
Est-il possible d'appliquer ce motif de recherche sur toutes les autres parenthèses?

Répondre

1

Pour ce faire, avec preg_replace_callback():

$txt = preg_replace_callback('#\[code\](.*)\[/code\]#isU', function($match) { 
    return "<div class=\"bb_uncode\">" . 
      str_replace('[', '&#91;', $match[1]) . 
      "</div>"); 
}, $txt); 
0

Vous pouvez le faire avec preg_replace seulement:

$txt = preg_replace('~(?>\[code]|\G(?<!^))[^[]*+\K\[(?!/code])~i', 
        '&#91;', $txt); 

détails Pattern:

(?>     # open a non capturing group (atomic *) 
    \[code]   # [code] 
|     # OR 
    \G    # contiguous to the last match 
    (?<!^)   # and not preceded by the begining of the string 
)     # close the non capturing group 
    [^[]*+   # 0 or more characters that are not a [ (possessive *) 
\K     # reset all that have been matched before 
\[     # a literal [ 
(?!/code])   # not followed by /code] 

(* quantificateur est possessif et le groupe est atomique pour éviter la regex e Enregistrement des positions de retour arrière. Donc, le modèle est plus performant. Toutefois, le modèle peut fonctionner sans ces fonctionnalités en remplaçant (?> par (?: et en supprimant + dans *+. Vous pouvez trouver plus d'informations sur ce sujet here et here.)