2008-09-21 12 views
6

Comment écrire une expression régulière pour convertir la marque en HTML? Par exemple, vous tapez dans ce qui suit:Expression régulière pour convertir la marque en HTML

This would be *italicized* text and this would be **bold** text 

Cela devrait alors être converti en:

This would be <em>italicized</em> text and this would be <strong>bold</strong> text 

Très similaire à la commande d'édition marque vers le bas utilisé par stackoverflow.

Précision

Pour ce qu'elle vaut, je suis en utilisant C#. En outre, ce sont seulement de vrais tags/markdown que je veux autoriser. La quantité de texte en cours de conversion serait inférieure à 300 caractères environ.

Répondre

7

La meilleure façon est de trouver une version de la bibliothèque de Markdown porté sur la langue que vous utilisez (vous ne spécifiez pas dans votre question).


Maintenant que vous avez précisé que vous ne voulez STRONG et EM à traiter, et que vous utilisez C#, je vous recommande de jeter un oeil à Markdown.NET pour voir comment ces balises sont mises en œuvre. Comme vous pouvez le voir, il s'agit en fait de deux expressions. Voici le code:

private string DoItalicsAndBold (string text) 
{ 
    // <strong> must go first: 
    text = Regex.Replace (text, @"(\*\*|__) (?=\S) (.+?[*_]*) (?<=\S) \1", 
          new MatchEvaluator (BoldEvaluator), 
          RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline); 

    // Then <em>: 
    text = Regex.Replace (text, @"(\*|_) (?=\S) (.+?) (?<=\S) \1", 
          new MatchEvaluator (ItalicsEvaluator), 
          RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline); 
    return text; 
} 

private string ItalicsEvaluator (Match match) 
{ 
    return string.Format ("<em>{0}</em>", match.Groups[2].Value); 
} 

private string BoldEvaluator (Match match) 
{ 
    return string.Format ("<strong>{0}</strong>", match.Groups[2].Value); 
} 
+0

Il ne devrait vraiment pas importer quelle langue ... il devrait y avoir une simple expression régulière pour gérer la condition. – mattruma

+0

J'ai ajouté quelques précisions à la question. – mattruma

+0

Markdown.NET est arrêté depuis longtemps. Au lieu de cela, il existe cette implémentation StackOverflow: MarkdownSharp - http://blog.stackoverflow.com/2009/12/introducing-markdownsharp/ –

5

Une seule regex ne fonctionnera pas. Chaque balisage aura son propre traducteur html. Mieux vaut voir comment les convertisseurs existants sont implémentés pour avoir une idée de comment cela fonctionne.

http://en.wikipedia.org/wiki/Markdown#See_also

+0

Je viens suis tombé sur l'article suivant à http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html. – mattruma

+0

peut être une bonne idée d'ajouter ce lien à votre message original. – jop

1

Je ne sais pas C# spécifiquement, mais en perl il serait:
s/
\ * \ * (*.?) \ * \ */
\ < gras> 1 \ </gras>/g
s/
$ \ * (. *) \ */
\ < em> $ 1 \ </em>/g

0

je suis tombé sur le fo Laisser post qui recommande de ne pas faire cela. Dans mon cas, je cherche à garder les choses simples, mais je pensais que je publierais ceci par jop's recommandation au cas où quelqu'un d'autre voulait le faire.