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

Langage Perl Discussion :

caractères spéciaux ou des chaines de caractères comme motif dans une RegExp


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Points : 101
    Points
    101
    Par défaut caractères spéciaux ou des chaines de caractères comme motif dans une RegExp
    Bonjour,

    Je vous explique mon souci, et ce que je veux faire.

    J'ai une fonction, avec en paramètre une requête SQL, et un motif, les 2 choisis par l'utilisateur.

    La requête SQL contient des éléments du type "$1", ou "%2", ou bien pourquoi pas "toto5", $, %, et toto étant respectivement alors le motif que l'utilisateur aura indiqué.

    Par exemple, si l'utilisateur choisit "$" comme motif, la requête qu'il pourra vouloir faire sera :

    Select * from table1 where colonne1 = '$1'
    Ou alors, si il choisit une chaine de caractère comme motif, on va prendre "toto", il peut avoir à écrire une requête telle que :

    Select colonne2 from table6 where colonne1 like 'toto1' and where colonne3 like 'toto2'
    Voici le code que j'ai mis en place pour le moment :

    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
     
    sub Fonction{
     
    my $motif = shift;
    my $test = "\\";
    $motif = $test.$motif;
     
     
    my $request = shift;
     
    while ($request =~ /$motif/) {
     
                    if ($request =~ /(.*)$motif(\d+)(.*)/){
     
                            my $value = traitementValue($2);
                            $request = $1.$value.$3;
     
                    }
            }
    }
    La regexp permet de récupérer le début de la requête, puis le chiffre accolé au motif, qui lui subit un traitement pour être remplacé par une valeur existant dans la table en question, puis la fin de la requête.

    La bouche while, permet d'effectuer la substitution des chiffres (\d+), pour chaque chiffre qui suit le motif sélectionné.

    On remarque que le motif choisi par l'utilisateur subit un traitement en amont, en lui accolant un antislash, afin de déspécifier le caractère (si s'en est un) choisit par l'utilisateur.

    Tout cela marche bien tant que le motif choisit par l'utilisateur est un caractère spécial, comme un "$", un "+", "@".

    Mais lorsque l'utilisateur choisit un mot comme motif, comme un anti-slash est accolé à ce mot, derrière ça se passe mal ...

    Quel est le moyen de pouvoir laisser à l'utilisateur le choix du motif, de manière à ce que le traitement se déroule correctement?

    Ai-je un moyen d'éviter de passer par l'utilisation d'une série de IF un peu lourde??

    Merci pour votre aide.

  2. #2
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Points : 101
    Points
    101
    Par défaut
    Bonjour,

    Hier en fin d'après-midi, j'ai résolu mon problème grâce à une fonction toute simple, et que j'avais déjà rencontré dans mon expérience de codeur en Perl en plus ....

    Pour que le motif choisi par l'utilisateur puisse comporter n'importe quel caractère, et puisse être utilisé dans la regexp sans aucun problème, il faut utiliser la fonction quotemeta.

    Cette fonction déspécifie tous les caractères spéciaux de la chaine de caractères ...

    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
     
    sub Fonction{
     
    my $motif = shift;
    $motif = quotemeta($motif);
     
    my $request = shift;
     
    while ($request =~ /$motif/) {
     
                    if ($request =~ /(.*)$motif(\d+)(.*)/){
     
                            my $value = traitementValue($2);
                            $request = $1.$value.$3;
     
                    }
            }
    }

    J'espère que ça aidera d'autres jeunes padawans perliens à l'avenir.

  3. #3
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Points : 93
    Points
    93
    Par défaut
    Tiens oui ça m'aide merci !

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

Discussions similaires

  1. Comparer des chaines de caractères comme des nombres
    Par PhilLU dans le forum Requêtes
    Réponses: 5
    Dernier message: 12/11/2014, 13h39
  2. Réponses: 3
    Dernier message: 26/03/2012, 11h32
  3. [VB.NET]comment on filtre des chaines de caractères ?
    Par zouhib dans le forum Windows Forms
    Réponses: 61
    Dernier message: 14/06/2006, 14h33
  4. [C++.net]Concatener des chaines de caractère
    Par Dlyan dans le forum MFC
    Réponses: 3
    Dernier message: 27/03/2006, 15h25
  5. Repérer des chaines de caractères formatée dans du texte
    Par jeremiegrenoble dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 01/02/2006, 13h06

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