2011-08-09 4 views
0

J'ai besoin d'aide pour remplacer mon BBCode. En ce moment je suis en train de faire ce qui suit pour rechercher et remplacer bbcode:Regex pour bbcode semble échouer sur des phrases longues

$bbMatch[0] = '/(\[b\])(.*)(\[\/b\])/'; 
    $bbReplace[0] = '<strong>${2}</strong>'; 

    $bbMatch[1] = '/(\[url\])(.*)(\[\/url\])/'; 
    $bbReplace[1] = '[url=${2}]${2}[/url]'; 

    $bbMatch[2] = '/(\[url=)(.+)(\])(.+)(\[\/url\])/'; 
    $bbReplace[2] = '<a href="${2}" target="_blank">${4}</a>'; 

    $bbMatch[3] = '/(\[s\])(.*)(\[\/s\])/'; 
    $bbReplace[3] = '<span style="text-decoration: line-through;">${2}</span>'; 

    $bbMatch[4] = '/(\[u\])(.*)(\[\/u\])/'; 
    $bbReplace[4] = '<span style="text-decoration: underline;">${2}</span>'; 

    $bbMatch[5] = '/(\[i\])(.*)(\[\/i\])/'; 
    $bbReplace[5] = '<em>${2}</em>'; 
    // Remove bad characters 
    $text = htmlspecialchars($text); 

    // Parse Smilies 
    $text = preg_replace($bbMatch, $bbReplace, $text); 

Le problème ici est que quand une grande phrase est couru à travers cela, il ne parvient pas à trouver la balise de fin. Il montrerait ceci est un exemple:

"Un texte en italique [/ i] avec quelques mots ici [i] aussi le texte en italique

Comme vous pouvez le voir, il montre la balise de fin de la le premier, et l'étiquette de début de la seconde Comment est-ce que je corriger ceci?

Répondre

2

Vous êtes le problème est que regex est gourmand par défaut.Il va donc tout saisir entre le premier [i] et le dernier [/i]. pour saisir des caractères génériques entre ceux-ci à des ensembles de caractères, et il essaie de saisir autant qu'il le peut, il attrapera volontiers le [/i] and [i] tant qu'il y a un environnement [i]..[/i]. Vous avez juste besoin d'ajouter un ? après le * pour le rendre non gourmand EX;

$bbMatch[5] = '/(\[i\])(.*?)(\[\/i\])/'; 
$bbReplace[5] = '<em>${2}</em>'; 

Vous voudrez changer toutes vos expressions rationnelles comme cela, pas seulement vos italiques.

Voici un exemple de gourmand par rapport à regex non gourmand: http://www.exampledepot.com/egs/java.util.regex/Greedy.html

+0

qui semble avoir résolu la plupart de mes questions. Ensuite, j'ai remarqué que lorsque la balise de fin n'est pas sur la même ligne que la balise de début, le code bbcode entier ne correspond pas. Une idée de comment réparer ça? –

+0

@Dave: Déposez votre regex, passez à la caisse [Code du babillard (Manuel PHP)] (http://php.net/manual/fr/book.bbcode.php) à la place. – hakre

+1

@Dave ajouter un 'm' après tout votre fin'/'comme:' '/ (\ [i \]) (. *?) (\ [\/I \])/m''. Cela rend la regex multiline. – Paulpro