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

 Delphi Discussion :

[D7] Construction d'une expression régulière


Sujet :

Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut [D7] Construction d'une expression régulière
    Bonjour,

    Est il possible par une expression régulière de vérifier si un nom de fichier correspond à un filtre (par exemple *.pas ou mieux ab??.*)

    J'utilise ceci, mais je suis incapable de bâtir la constante REGEX :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    unit Princ;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls ,
      {$IF CompilerVersion >= 22.0}   // Delphi XE ou supérieur
        RegularExpressionsCore;
      {$ELSE}
        PerlRegex; (* http://www.regular-expressions.info/download/TPerlRegEx.zip *)
      {$IFEND}
     
    type
      TF_Princ = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      F_Princ: TF_Princ;
    implementation
    {$R *.dfm}
    { ================================================================ }
    function IsValidString(const s: string): boolean;
    const
    // ici pour chercher un nom de répertoire valide
    REGEX = '^[A-Za-z]:(\\|(\\(\.*[^\\/:*?"<>|.]+)+)+)$';
    var
      expr: TPerlRegex;
    begin
      expr := TPerlRegex.Create;
      expr.Subject := utf8string(s);
      expr.RegEx := REGEX;
      result := expr.Match;
      expr.Free;
    end;
    { ================================================================ }
    procedure TF_Princ.Button1Click(Sender: TObject);
    begin
      If IsValidString(Edit1.Text) Then
         ShowMessage('Concordance trouvée')
      Else
         ShowMessage('Concordance non trouvée')  ;
    end;
    { ================================================================ }
    end.
    S'il y a une autre méthode, je suis preneur.
    Je sais que TOpendialog le fait par une autre méthode. J'ai essayé de mettre le nez dans le code, mais sans succès

    Merci
    A+
    Charly

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    En supposant qu'il s'agit de chemins absolus, je dirais:



    Mais je ne suis pas plus au fait que ça des conventions de nommage des répertoires et des fichiers sous NTFS ou FAT.
    À la lecture de https://support.microsoft.com/fr-fr/...s-file-systems il n'y a à priori pas de raison d'exclure le point.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Merci CosmoKnacki,
    je vais tester ces 2 expressions demain.

    Mon problème serait de construire l'expression en fonction du filtre contenu dans une variable ...

    A+
    Charly

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    En gros tu voudrais convertir un pseudo glob portant uniquement sur le nom du fichier en expression régulière?

    Si on part sur une syntaxe avec juste: * et ?.

    Tu peux déjà utiliser ^[A-Za-z]:\\(?:[^?"/\\<>*|:]+\\)*+ comme préfixe et $ comme suffixe.

    Ensuite tu devras passer ton filtre par TPerlRegEx.EscapeRegExChars afin qu'il échappe les caractères spéciaux (des regex).

    Puis pour finir, on remplace les caractères glob (qui sont désormais échappés avec un antislash) \* par
    [^?"/\\<>*|:]* (ou éventuellement .*) et \? par [^?"/\\<>*|:] (ou éventuellement .).

    Il ne reste plus qu'à joindre le tout.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    S'il y a une autre méthode, je suis preneur.
    En voici une :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TPath.MatchesPattern(FileName, 'ab??.*', FALSE)
    EDIT : Oups! Pas vu D7

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Merci beaucoup CosmoKnacki,

    Mais je suis nul en expressions régulières et je n'ai rien compris

    Peux tu m'expliquer un peu plus ?
    Préfixe et suffixe, est ce que ce sont les chaines que je dois mettre au début et à la fin de ma chaine REGEX ?
    Que veut dire échapper les caractères spéciaux (des regex) ?
    Qu'appelles tu les caractères glob ?

    Pour fixer les idées, je pensais partir d'une chaine Filtre (qui contiendrait par exemple tot??.*) et tester une chaine comme par exemple totxx.pas (il faut prendre en compte tous les caractères valides pour un nom de fichier Windows).

    A+
    Charly

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    Préfixe et suffixe, est ce que ce sont les chaines que je dois mettre au début et à la fin de ma chaîne REGEX ?
    Oui, c'est exactement ça.

    Qu'appelles tu les caractères glob ?
    https://en.wikipedia.org/wiki/Glob_%28programming%29

    Que veut dire échapper les caractères spéciaux (des regex) ?
    Dans une regex, certains caractères ont un sens spécial (contrairement à a, b ou c qui représentent les caractères a,b ou c). Ces caractères sont ( ) [ { | \ ^ $ . ? * +. Or ces caractères peuvent figurer dans ta chaîne filtre, c'est pourquoi, tu dois passer ta chaîne filtre par TPerlRegEx.EscapeRegExChars qui se charge d'échapper ces caractères spéciaux (ce qui revient concrètement à placer un antislash devant). Ainsi tot??.* deviendra tot\?\?\.\*.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Pour fixer les idées, je pensais partir d'une chaine Filtre (qui contiendrait par exemple tot??.*)
    un bricolage pour construire l'expression à base de StringReplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    S:='tot??.*';
    expression:=StringReplace(S,'.','\.',[rfReplaceAll]); // échapper le .
    expression:=StringReplace(S,'*','\w*',[rfReplaceAll]); // remplacer *
    expression:=StringReplace(S,'?','\w{1}',[rfReplaceAll]); // remplacer le(s) point(s) interrogation
    résultat
    tot\w{1}\w{1}\.\w*
    auquel il faut ajouté ^ en début et \z en fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    expression:='^'+expression+'\z';
    Je ne me souviens plus si '?' est un caractère obligatoire (comme je le fais ici) ou optionnel, remplacer par '\w(0,1)'
    c'est "moche" car remplacer '??' devrait être remplacé par \w{2}
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    j'ai testé tes 2 premières expressions mais expr.Match renvoie toujours False ?

    A+
    Charly

  10. #10
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Tu les as testées sur quelles chaînes de caractères?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    re,

    pour d7 tu peux aussi passer sans les expressions régulières avec Tmask.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    uses Masks;
     
    procedure check(filename, modele : string) : boolean;
    var mask : TMask;
    begin
    mask:=TMask.Create(modele);
    try 
      result:=mask.matches(filename);
    finally
      mask.free;
    end;
     
    end;
    exemple : check('toto21.pas','tot???.*') -> true
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Chapeau bas SergioMaster

    Les tests que j'ai effectués semblent parfaitement fonctionner :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    unit Princ;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls ,
      {$IF CompilerVersion >= 22.0}   // Delphi XE ou supérieur
        RegularExpressionsCore;
      {$ELSE}
        PerlRegex; (* http://www.regular-expressions.info/download/TPerlRegEx.zip *)
      {$IFEND}
     
    type
      TF_Princ = class(TForm)
        Label1: TLabel;
        E_Fichier: TEdit;
        E_Filtre: TEdit;
        Label2: TLabel;
        Label3: TLabel;
        E_Regex: TEdit;
        Btn_Verif: TButton;
        procedure Btn_VerifClick(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      F_Princ: TF_Princ;
      REGEX : String ;
    implementation
    {$R *.dfm}
    { ================================================================ }
    function TraiteFiltre(Const S : String) : String ;
    Var
     expression : String ;
    Begin
      expression:=StringReplace(S,'.','\.',[rfReplaceAll]); // échapper le .
      expression:=StringReplace(expression,'*','\w*',[rfReplaceAll]); // remplacer *
      expression:=StringReplace(expression,'?','\w{1}',[rfReplaceAll]); // remplacer le(s) point(s) interrogation
      expression:='^'+expression+'\z';
      Result := expression ;
    End ;
    { ================================================================ }
    function IsValidString(const s: string): boolean;
    var
      expr: TPerlRegex;
    begin
      expr := TPerlRegex.Create;
      expr.Subject := utf8string(s);
      expr.RegEx := REGEX;
      result := expr.Match;
      expr.Free;
    end;
    { ================================================================ }
    procedure TF_Princ.Btn_VerifClick(Sender: TObject);
    Var
      Filtre : String ;
      Fichier : String ;
    begin
      E_Regex.Text := EmptyStr ;
      Filtre := E_Filtre.Text ;
      Fichier := E_Fichier.Text ;
      REGEX := TraiteFiltre(Filtre) ;
      E_Regex.Text := REGEX  ;
      If IsValidString(Fichier) Then
         ShowMessage('Concordance trouvée')
      Else
         ShowMessage('Concordance non trouvée')  ;
    end;
    { ================================================================ }
     
    end.
    avec le dfm :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    object F_Princ: TF_Princ
      Left = 648
      Top = 283
      Width = 671
      Height = 178
      Caption = 'Test de RegEx'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object Label1: TLabel
        Left = 32
        Top = 24
        Width = 37
        Height = 13
        Caption = 'Fichier :'
      end
      object Label2: TLabel
        Left = 32
        Top = 56
        Width = 28
        Height = 13
        Caption = 'Filtre :'
      end
      object Label3: TLabel
        Left = 32
        Top = 88
        Width = 37
        Height = 13
        Caption = 'REGEX'
      end
      object E_Fichier: TEdit
        Left = 80
        Top = 22
        Width = 129
        Height = 21
        TabOrder = 0
        Text = 'tot12.pas'
      end
      object E_Filtre: TEdit
        Left = 80
        Top = 54
        Width = 129
        Height = 21
        TabOrder = 1
        Text = 'tot??.*'
      end
      object E_Regex: TEdit
        Left = 80
        Top = 86
        Width = 537
        Height = 21
        TabOrder = 2
      end
      object Btn_Verif: TButton
        Left = 248
        Top = 52
        Width = 121
        Height = 25
        Caption = 'Vérification'
        TabOrder = 3
        OnClick = Btn_VerifClick
      end
    end
    Même si le ?? est moche, cela semble bien fonctionner !!

    Merci aussi à CosmoKnacki
    .

    A+
    Charly

  13. #13
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    @ CosmoKnacki : j'ai testé avec toto.pas et ab12.pas sans succès ?

    @ SergioMaster : je en connaissais pas l'unité Mask, cela à l'air encore plus simple !

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Re,

    en fait TMask est certainement plus efficace et plus "portable", et ce quelque-soit la version de Delphi de plus pas besoin d'expressions régulières non fournies avec les anciennes versions.
    D'ailleurs, j'ai eu la curiosité de regarder dans les sources de Rio et la fonction proposée par AndNotor (MatchesPattern) fait appel à un TMask (le pattern étant vérifié avant)

    j'ai testé avec toto.pas et ab12.pas sans succès ?
    normal, l'expression est faite pour un chemin entier
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  15. #15
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Pour Masks, j'ai ajouté :

    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
    { ================================================================ }
    //  Uses : Masks ...
    Function check(filename, Filtre : string) : boolean;
    var
      Mask : TMask;
    begin
      Mask:=TMask.Create(Filtre);
      try
        result:=mask.matches(filename);
      finally
        mask.free;
      End ;
    end;
    { ================================================================ }
    procedure TF_Princ.Btn_MaskClick(Sender: TObject);
    Var
      Filtre : String ;
      Fichier : String ;
    begin
      Filtre := E_Filtre.Text ;
      Fichier := E_Fichier.Text ;
      If check(Fichier, Filtre) Then
         ShowMessage('Concordance trouvée')
      Else
         ShowMessage('Concordance non trouvée')  ;
    end;
    { ================================================================ }
    ça fonctionne "nickel". Je vais utiliser cette solution qui semble effectivement plus solide.

    Merci
    A+
    Charly

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

Discussions similaires

  1. Construction d'une expression régulière
    Par danyboy85 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 07/12/2006, 11h11
  2. Une expression réguliére
    Par BRAUKRIS dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 09/09/2005, 20h14
  3. Réponses: 6
    Dernier message: 17/08/2005, 12h38
  4. Problème sur une expression régulière
    Par Verbal-Quint dans le forum Langage
    Réponses: 6
    Dernier message: 12/11/2004, 10h54
  5. [Regex] Vérifier qu'une chaîne respecte une expression régulière
    Par PeteMitchell dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 13/05/2004, 14h22

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