IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Remplacer tag entre crochet par une balise HTML avec une classe tag


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 988
    Par défaut Remplacer tag entre crochet par une balise HTML avec une classe tag
    Bonjour,

    Cela a surement été abordé sur ce forum mais je n'arrive pas à trouver de topic en recherchant avec mes mots à moi.
    Ce que je cherche à réaliser est ce que fait nativement le forum avec les balises CODE mais en plus simple.

    En gros je veux remplacer dans un texte toute les tags entre crochet par une balise span.
    Exemple : ​
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bonjour ceci est [important]mise en évidence d'une façon[/important] et ceci est [citation]mis en évidence autrement[/citation]
    devient
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    Bonjour ceci est <span class="important">mise en évidence d'une façon </span> et ceci est <span class="citation">mis en évidence autrement</span>

    Pour l'instant j'ai pondu ce code que je ne trouve pas très élégant et je cherche une manière de l'améliorer.
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    String input = "Are you ready for regex [important] magic [/important] ?";
    String pattern1 = @"(?<=\[)(.*?)(?=\])";
    String pattern2 = @"\[(.*?)\]";
    MatchCollection output1 = Regex.Matches(input, pattern1, RegexOptions.Singleline | RegexOptions.IgnoreCase);
    MatchCollection output2 = Regex.Matches(input, pattern2, RegexOptions.Singleline | RegexOptions.IgnoreCase);
    for (Int32 i = 0; i < output1.Count; i++)
    {
        if (output1[i].Value.StartsWith("/"))
        {
            input = input.Replace(output2[i].Value, "</span>");
        }
        else
        {
            input = input.Replace(output2[i].Value, String.Format(CultureInfo.InvariantCulture, @"<span class=""{0}"">",
                output1[i].Value));
        }
    }
    Console.WriteLine(input);
    System.Console.ReadLine();

    Merci.

  2. #2
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Par défaut
    Salut,

    La methode replace pourrais faire le taff bien plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    using System;
     
    public class Program
    {
    	public static void Main()
    	{\
    		string input = "Are you ready for regex [important] magic [/important] ?";
    		var res = input.Replace("[important]","<span class=\"important\">")
    			.Replace("[/important]","</span>");
     
    		Console.WriteLine(res);
    	}
    }
    Edit: apres relecture du sujet, je vois que je reponds completement a cote...

  3. #3
    Membre expérimenté
    Homme Profil pro
    Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique
    Inscrit en
    Décembre 2014
    Messages
    458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 458
    Par défaut
    Hello,

    Bon déjà si ton code fait le job je dirais que c'est pas mal. Je t'avoue que je n'ai pas envie de lire de tête les paramètres Regex , mais je sais ce que tu veux faire, je l'ai eu fait à une époque quand je faisais des hacks sur vbb.

    Maintenant l'élégance de ton code, en c# tu peux utiliser les expressions conditionnelles, si tu veux déjà avoir quelque chose d'un peu plus sympa à lire.

    exemple ultra basique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
              bool tooTest = true;
              int res = tooTest ? 1 : -1;
    Et c'est encore plus simple si tu veux passer une valeur quand la variable à tester doit être remplacée si elle est 'null'.

    Et tu peux faire sauter aussi {} quand tu n'as qu'une instruction qui suit.

    tu peux trouver des infos intéressantes en allant chercher du côté du scraping, c'est pas le même balisage pour le xml (par exemple) mais le principe sera le même.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 155
    Par défaut
    Pas certain qu'il y ait mieux qu'un Regex pour traiter ça en C#, à part l'appel system d'un script Perl. Mais on reste sur des expressions régulières.

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 988
    Par défaut
    Krantz,
    Ce n'est pas l'utilisation d'expressions régulières qui me dérange, c'est plutôt le fait d'être obligé d'en avoir deux pour pouvoir faire un String.Replace()
    - un qui renvoie [tag] et [/tag]
    - un qui renvoie tag et /tag

    Je me demandais s'il n'y avais pas plus simple avec une méthode de Regex que je ne connais pas.

    daerlnaxe,
    Je ne suis pas certain que le raccourci syntaxique "? :" améliore l'élégance dans ce cas là.
    En tout cas, ce n'est qu'un avis parmi d'autre, mais ça n'aide pas à la lisibilité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    input = output1[i].Value.StartsWith("/") ? input.Replace(output2[i].Value, "</span>") : input.Replace(output2[i].Value, String.Format(CultureInfo.InvariantCulture, @"<span class=""{0}"">", output1[i].Value));
    Quand à faire sauter les accolades, je pense que c'est une mauvaise habitude car :
    D'une part c'est un coup à les oublier en cas d'ajout de nouvelles lignes dans le bloc.
    D'autre part ça nuit à la relecture surtout quand certaines personnes ont des habitudes d'indentation bizarres.
    Quand tu relis et que tu vois deux lignes sous un if (avec la même indentation, ou qui sont collées), tu ne sais pas si c'est fait exprès et que c'est simplement mal indenté ou si le développeur à oublier de mettre les accolades.
    En les mettant systématiquement, tu ne te pose plus la question.
    Le plus sain est de rédiger des règles d'écritures que chacun doit suivre.

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Je pense que tu recherches un truc dans ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    using System;
    using System.Text.RegularExpressions;
     
    public class MyBBCode
    {
        public static Regex rTag = new Regex(
            @" \[ (?<close> / )? (?<name> \w+ ) \] ",
            RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace
        );
     
        public static void Main()
        {
            string s = @"Bonjour ceci est [important]mis en évidence d'une façon[/important] et ceci"
                     + @" est [citation]mis en évidence autrement[/citation]";
     
            MatchEvaluator evaluator = new MatchEvaluator(ReplaceTag);
     
            string result = rTag.Replace(s, evaluator);
     
            Console.WriteLine(result);
        }   
     
        public static string ReplaceTag(Match match)
        {
            if ( match.Groups["close"].Success )
                return "</span>";
     
            return String.Format(@"<span class=""{0}"">", match.Groups["name"].Value);
        }
     
    }
    (Désolé, je n'ai pas mis d'accolades au if, hihihi!)

    L'intérêt de déporter le remplacement dans une fonction déléguée, mis à part ton problème de départ, est que tu vas pouvoir ajouter les traitements que tu veux à l'intérieur, comme par exemple le fait de tester si ce tag existe (si tu l'autorises). Ça ouvre aussi des perspectives: rien ne t'oblige avec un tel système de te cantonner à la balise span, ce qui te permettra d'améliorer la sémantique html (et donc le référencement).

  7. #7
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 988
    Par défaut
    Merci
    Ce que tu proposes me plait beaucoup.

    Au final mon code va ressembler à celui-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    String input = "Are you ready for regex [important]magic[/important] ?";
     
    Regex regex = new Regex(@" \[ (?<close> / )? (?<open> \w+ ) \] ",
        RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace);
     
    MatchEvaluator evaluator = new MatchEvaluator(matches =>
    {
        if (matches.Groups["open"].Success)
        {
            return String.Format(CultureInfo.InvariantCulture, @"<span class=""{0}"">", matches.Groups["open"].Value);              
        }
     
        return "</span>";
    });
     
    String output = regex.Replace(input, evaluator);
    Console.WriteLine(output);
    J'ai pris l'option de passer par une expression lambda car le texte en entrée est une ressource modifiée par un développeur qui sait quelles classes il peut utiliser, donc aucun test complémentaire n'est a effectuer.
    Quand aux balises, je n'ai pas trop le choix. En fait je rajoute du comportement et du texte à une page d'aide swagger générée par swashbuckle.
    Or swashbuckle a malheureusement tendance à supprimer du contenu s'il y a une balise ou un attribut qui ne lui plait pas.
    Une simple balise span accompagné d'un CSS malin me permet d'avoir visuellement le rendu que j'aurai eu en utilisant des balises adaptées.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplacer chaine de caractères par une autre chaine
    Par unmaxdemily dans le forum SAS Base
    Réponses: 2
    Dernier message: 25/06/2008, 09h11
  2. Réponses: 3
    Dernier message: 10/05/2008, 12h55
  3. [RegEx] supprimer une balise html avec son contenu
    Par waldoun dans le forum Langage
    Réponses: 7
    Dernier message: 06/02/2008, 11h19
  4. Problème pour remplacer le bouton submit par une image
    Par Leena666 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 14
    Dernier message: 24/06/2007, 16h30
  5. Remplacer l'instruction GO par une instruction SQL
    Par Sytchev3 dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 06/04/2006, 09h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo