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 :

Regex et remplacement de chaines


Sujet :

C#

  1. #1
    Membre régulier Avatar de Othana
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 188
    Points : 86
    Points
    86
    Par défaut Regex et remplacement de chaines
    Ca fait longtemps que j'ai pas posté sur le forum.

    Bon alors j'ai un souci avec une fonction utilisant une regex pour remplacer une url en balise <a href=.....> etc.
    Dans cette fonction, je cherche à trouver une chaine du genre et la transformer en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="monurl">montexte</a>
    ET, toujours dans le même bloc de texte, chercher les url pour les retranscrire en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="monurl">monurl</a>
    afin de la rendre cliquable.
    cette deuxième partie fonctionne très bien. la première ne matche rien du tout et quand bien même j'y arriverais, je n'ai pour l'instant pas d'idée pour combiner les deux sans que la 2ème n'écrase le résultat de la première.
    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
            public static string UrlReformate(string rawtext)
            {
                string result = "";
     
                if (rawtext != null)
                {
                    string re1 = @"^(?:\[\[.*\|(?:(?:\w+):\/\/(?:[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*)\]\])$";
                    string re2 = @"(?:(?:\w+):\/\/(?:[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*)";
                    Regex r1 = new Regex(re1, RegexOptions.IgnoreCase | RegexOptions.Singleline);
                    Regex r2 = new Regex(re2, RegexOptions.IgnoreCase | RegexOptions.Singleline);
     
                    if (r1.Match(rawtext).Success)
                    {
                        result = r1.Replace(rawtext, delegate(Match m)
                        {
                            string[] match = m.Value.Split('|');
                            return "<a href='" + match[1] + "'>" + match[0] + "</a>";
                        });
                    }
                    else
                        result = r2.Replace(rawtext, delegate(Match m)
                        {
                            return "<a href='" + m.Value + "'>" + m.Value + "</a>";
                        });
                }
                return result;
            }
    Texte d'essai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    test
     
    ceci est un texte de test
    [[cliquer ici|http://www.google.fr]], pour ouvrir Google.

  2. #2
    Membre régulier Avatar de Othana
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 188
    Points : 86
    Points
    86
    Par défaut
    bon, après des recherche et de l'aide, j'en arrive à ce code :
    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
            public static string UrlReformate(string rawtext)
            {
                string result = "";
     
                if (rawtext != null)
                {
                    string re1 = @"\[\[(.+)\|((?:(?:\w+):\/\/(?:[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*))\]\]";
                    string re2 = @"(\|?)((?:(?:\w+):\/\/(?:[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*))";
                    Regex r1 = new Regex(re1, RegexOptions.IgnoreCase);
                    Regex r2 = new Regex(re2, RegexOptions.IgnoreCase);
                    if (r2.Match(rawtext).Success)
                        result = r2.Replace(rawtext, delegate(Match m)
                        {
                            if (m.Groups[1].Value == "|")
                                return m.Groups[0].Value;
                            return "<a href='" + m.Groups[0] + "'>" + m.Groups[0] + "</a>";
                        });
                    if (r1.Match(result).Success)
                    {
                        result = r1.Replace(result, delegate(Match m)
                        {
                            return "<a href='" + m.Groups[2] + "'>" + m.Groups[1] + "</a>";
                        });
                    }
     
                }
                return result;
            }
    Cependant, il s'avère que ça ne fonctionne pas si on n'a pas le protocole avant l'adresse (genre http:// ou https:// ou autre). si l'url commence directement par www. ça ne fonctionne plus.
    Il me faudrait donc aussi gérer cela.

  3. #3
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Ahh, matcher les url sans aucune erreur, bah c'est juste la galère. Du moins si tu suis la norme complète. On pense souvent qu'une url c'est juste "http://www.google.fr". En fait une url c'est "schema://user:password@domain.ext:port/path/to/resource?p1=v1&p2=v2#fragment"
    Sachant que le schema peut être omis sur les navigateurs, auquel cas c'est "http". Si les explorateurs de fichiers également il peut être omis, sinon c'est "file".
    Le mot de passe n'apparait que s'il y a un utilisateur. Le chemin de la resource est "/" s'il est omis. Il peut ne pas y avoir de querystring, de fragment, de mot de passe, etc...
    Donc c'est vraiment la mort une expression qui matche réellement tout en toute circonstance.

    Personnellement j'utilise ce pattern : private const string URL_PATTERN = @"^((?<protocol>[\w]+)://)?((?<user>[^:@\s]+)(@|:(?<password>[^@\s]+)@))?((?<host>[\w\d\._]+)(\:(?<port>\d+))?)?(?<resource>[^\?\s]*)(\?(?<query>[^\#\s]+))?(#(?<frag>.*))?$";J'ai consommé pas mal de doliprane pour la faire.
    Jusqu'a présent je ne suis pas tombé sur un cas qu'elle ne matche pas. Mais je suis très très loin d'avoir tout testé.
    Attention, le pattern valide qu'une chaine est une url, il ne recherche pas une url dans un texte. Mais un petit peu d'adaptation devrait lui permettre de remplir ce rôle.

    Pour ton cas [[montext|monurl]], je ne m'embêterai pas à ta place. La le pattern est simple, ne vérifie pas si l'url est bonne, elle donnera lieu à un lien pourri au pire.
    private const string WIKILINK_PATTERN = @"\[\[(?<text>[^|]+)\|(?<url>[^\]]+)\]\]";Pas testé, mais ça devrait suffire je pense.

Discussions similaires

  1. Regex pour remplacer une chaine par un lien
    Par lerorodu51 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/03/2014, 16h52
  2. Réponses: 4
    Dernier message: 31/08/2010, 18h45
  3. Javascript : Regex !? Remplacer une chaine dont on ne connait pas la valeur
    Par adrianevens dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/01/2007, 17h03
  4. Word ole et demande de remplacement de chaine
    Par dd16 dans le forum Langage
    Réponses: 6
    Dernier message: 24/09/2005, 13h56
  5. Réponses: 4
    Dernier message: 16/04/2004, 17h31

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