2010-12-04 52 views
1

Je travaille sur une fonctionnalité qui utilise le JQuery MarkItUp! éditeur en tant qu'éditeur BBCode. Je ne permettant à un petit sous-ensemble de BBCodes dont les suivantes:RegEx pour supprimer les balises BBCode d'une chaîne

[b] 
[i] 
[quote] 
[quote=Mr Incredible] 
[img] 
[url] 
[youtube] 

J'ai un champ de 1500 caractères « Description » qui utilise l'éditeur, mais je prévois également de stocker un 150 caractère condensé de la description avec tout le BBCode supprimé. J'utilise actuellement un simple RegEx pour le faire en C#. Il s'agit essentiellement d'un code BBCode incorporé dans une chaîne, mais il laisse derrière lui beaucoup de "contenu bruyant" comme l'URL [img] ou l'identifiant vidéo [youtube] que j'aimerais supprimer du résumé.

Voici mon RegEx actuel:

public static String StripBBCode(string bbCode) 
    { 
    string r = Regex.Replace(bbCode, 
    @"\[(.*?)\]", 
    String.Empty, RegexOptions.IgnoreCase); 

    // Finally, replace all newlines with a space 
    r = Regex.Replace(r, 
    @"(\r\n|\n\r|\r|\n)+", 
    @" ", RegexOptions.IgnoreCase); 

    return r; 
    } 

Si je lance la chaîne suivante grâce à cette fonction, je reçois le résultat indiqué ci-dessous:

source de

This is [b]bold[/b]. This is [i]italic[/i]. 

Here is an image: 
[img]http://www.phatmac.com/Pics/Movies/Incredibles.jpg[/img] 

Here is a link to [url=http://espn.go.com]ESPN[/url]. 

Here is a YouTube video: 

[youtube]WJ0UkZ3W4FA[/youtube] 

résultat

Ceci est en gras. C'est italique. Voici une image: http://www.phatmac.com/Pics/Movies/Incredibles.jpg Voici un lien vers ESPN. Voici une vidéo YouTube: WJ0UkZ3W4FA

Voici ce que je veux revenir

C'est en gras. C'est italique. Voici une image: Voici un lien vers ESPN. Voici une vidéo YouTube:

Comment puis-je modifier ma fonction StripBBCode() pour y parvenir?

ÉDITÉ

La suggestion de David ci-dessous dans la première réponse était correcte.

Voici ce que j'utilise maintenant:

string r = Regex.Replace(s, 
    @"\[youtube\].*\[\/youtube\]", 
    String.Empty, RegexOptions.IgnoreCase); 

r = Regex.Replace(r, 
    @"\[img\].*\[\/img\]", 
    String.Empty, RegexOptions.IgnoreCase); 

Répondre

2

Vous avez plusieurs balises que vous voulez retirer le contenu, et le reste où vous voulez que les balises retirées.

Remplacez [img].*[/img] par string.empty, et [youtube].*[/youtube], et si nécessaire, supprimez [.*].

Edit:

Je ne suis pas un expert en regex non plus, mais je pense que @"\[img\].*?\[/img\]" est ce que vous voulez. Je ne pense pas que vous ayez besoin des parenthèses dans @"\[(.*?)\]", je pense que dans ce contexte, les parenthèses signifient sauvegarder le texte correspondant afin que vous puissiez le retrouver avec \1.

+0

À quoi ressemble le RegEx pour supprimer [img]. * [/ Img]? Je ne suis pas un maven RegEx, et les expressions régulières originales dans ma fonction étaient le résultat de nombreuses sessions de copier-coller pour obtenir la bonne syntaxe. –

+0

Merci.J'ai une version ajoutée à la fin de la question initiale qui semble fonctionner. Le mien n'a pas le point d'interrogation intégré comme le vôtre. En tout cas, merci de me pointer dans la bonne direction. Je vous en suis reconnaissant! –

+0

Le point d'interrogation sur '. *?' Rend cette expression paresseuse, en consommant le nombre minimum de caractères nécessaires pour satisfaire l'expression. Sans cela, l'expression régulière réduira '[img] asdf [/ img] Texte important [img] asdf [/ img]' en une chaîne vide. –