2009-05-11 8 views
0

J'ai besoin d'une expression régulière pour supprimer tout BBCode dans une chaîne. J'ai les éléments suivants (et un tableau avec les tags):Regex pour supprimer BBCode

new RegExp('\\[' + tags[index] + '](.*?)\\[/' + tags[index] + ']'); 

Il prend [tag] ce [/ tag] très bien, mais échoue lors de l'utilisation [url = http://google.com]this[/url].

De quoi ai-je besoin pour changer? Merci beaucoup.

+0

Vous voulez plutôt de supprimer toutes les balises que vous avez donné dans le tableau 'tags'. – Gumbo

Répondre

1

Vous devez autoriser tout caractère autre que ']' après une balise jusqu'à ce que vous trouviez ']'.

new RegExp('\\[' + tags[index] + '[^]]*](.*?)\\[/' + tags[index] + ']'); 

Vous pourriez simplifier ceci à l'expression suivante.

\[[^]]*]([^[]*)\[\\[^]]*] 

Le problème qui est, qu'il correspondra [WrongTag]stuff[\WrongTag] aussi. La correspondance des balises imbriquées requiert l'utilisation de l'expression plusieurs fois.

+0

Pourquoi devriez-vous vous intéresser à l'imbrication de balises alors que votre objectif est de sortir des balises BBcode quand même? – Tomalak

+0

[^]] doit s'échapper vers [^ \\\]] –

0

Je pense

new RegExp('\\[' + tags[index] + '(=[^\\]]+)?](.*?)\\[/' + tags[index] + ']'); 

devrait le faire. Au lieu du groupe 1, vous devez alors choisir le groupe 2.

+0

[^ \\\]] ne correspond pas aux caractères autres que ']' mais aux caractères autres que '\' suivi de ']' car vous ne devez pas échapper ' ] 'dans la première position. Correct est [^]]. –

1

Pour dépouilleront une BBCode, utilisez quelque chose comme:

string alltags = tags.Join("|"); 
RegExp stripbb = new RegExp('\\[/?(' + alltags + ')[^]]*\\]'); 

Remplacer globalement par la chaîne vide. Pas de boucle supplémentaire nécessaire.

+0

[^ \\\]] ne correspond pas aux caractères autres que ']' mais aux caractères autres que '\' suivi de ']' car vous ne devez pas échapper ']' dans la première position. Correct est [^]]. –

+0

Il n'y a pas de "suivi par" dans une classe de caractères. Si quelque chose, la classe de caractères correspond à tout sauf "\" et "]". Je vais enlever le backslash excédentaire. – Tomalak

1

Vous pouvez vérifier les balises en utilisant un équilibre backreference:

new RegExp('\\[(' + tags.Join('|') + ')[^]]*](.*?)\\[/\\1]'); 

Le vrai problème est que vous cant't correspondre les balises imbriquées arbitraires dans une expression régulière (qui est la limite d'une langue régulière). Certaines langues permettent des expressions régulières récursives, mais ce sont des extensions (qui les rendent techniquement non régulières, mais ne changent pas le nom que la plupart des gens utilisent pour les objets).

Si vous ne se soucient pas de balises équilibrées, vous pouvez simplement enlever toute étiquette vous trouvez:

new RegExp('\\[/?(?:' + tags.Join('|') + ')[^]]*]'); 
+0

Balancing balancing est totalement hors de propos ici. L'OP veut que les étiquettes soient enlevées, non appariées. – Tomalak

1

Je suis tombé sur ce fil et trouvé utile de me faire sur la bonne voie, mais voici un ultime que j'ai passé deux heures bâtiment (c'est mon premier RegEx!) pour JavaScript et testé pour fonctionner très bien pour les nids fous et même des chaînes imbriquées de manière incorrecte, il fonctionne !:

string = string.replace(/\[\/?(?:b|i|u|url|quote|code|img|color|size)*?.*?\]/img, ''); 

Si string = « [b ] [couleur = bleu] [url = www.google.com] Google [/ url] [/ color] [/ b] "alors la nouvelle chaîne sera" Goo " gle ". Incroyable.

quelqu'un

Hope trouve très utile, ce fut un match au sommet pour « JavaScript strip RegEx BBCode » dans Google;)

+0

merci - c'est la seule solution sur la page qui a fonctionné pour moi. – Neuralrank

0

Rappelez-vous que beaucoup (la plupart) des saveurs regex par défaut ne laissez pas la ligne de correspondance de caractère méta DOT? terminateurs. Provoquer une étiquette comme

"[foo]dsdfs 
fdsfsd[/foo]" 

échouer. Activez DOTALL en ajoutant "(?s) "à votre regex, ou remplacer le méta-char DOT dans votre regex par la classe de caractères [\ S \ s]

1

J'ai eu un problème similaire - en PHP pas Javascript - j'ai dû supprimer BBCode . [quote] tags et aussi les quotes dans les balises problème Ajouté dans qu'il y a souvent des choses plus arbitraire dans la [quote] étiquette, par exemple [quote:7e3af94210="username"]

Cela a fonctionné pour moi:

$post = preg_replace('/[\r\n]+/', "\n", $post); 
$post = preg_replace('/\[\s*quote.*\][^[]*\[\s*\/quote.*\]/im', '', $post); 
$post = trim($post); 

lignes 1 et 3 sont juste pour ranger toutes les nouvelles lignes supplémentaires, et ceux qui restent à la suite de la regex

0

cela a fonctionné pour moi, pour chaque nom de tag. il soutient également des chaînes comme « [url = « blablabla »] [/ url] »

str = str.replace(/\[([a-z]+)(\=[\w\d\.\,\\\/\"\'\#\,\-]*)*(*[a-z0-9]+\=.+)*\](.*?)\[\/\1\]/gi, "$4")