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 Delphi Discussion :

Comment supprimer tous les caractères spéciaux d'une string ?


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Comment supprimer tous les caractères spéciaux d'une string ?
    Bonjour,

    Je désire supprimer tous les caractères spéciaux d'un str.
    J'ai trouvé un code qui me parait convenir, je l'ai intregrer dans une procédure mais cela ne fonctionne pas.

    Si quelqu'un pourrai m'aider ?

    Merci d'avance.

    La procedure en PJ

    Le 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
    i :longint;
    Result : string;
     
    begin
       Result := '';
       for i := 1 to Length(str)
       do
       begin
          Case str[i] of
             'A'..'Z', 'a'..'z' : Result := Result + str[i];
             '0'..'9'          : Result := Result + str[i];
             ' '               : Result := Result + str[i];
          end;
       end;
    end;
    Fichiers attachés Fichiers attachés

  2. #2
    Membre régulier Avatar de newbie57
    Inscrit en
    Juin 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2005
    Messages : 124
    Points : 92
    Points
    92
    Par défaut
    Bonjour,

    As-tu essayé AnsiReplaceStr en prennant soin d'ajouter StrUtils dans uses. Tu remplaces tous tes caractères speciaux par ''.


  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par cooldid Voir le message

    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
     
    Function MyTrim(str:string):string;
    i :longint;
    begin
       Result := '';
       for i := 1 to Length(str)
       do
       begin
          Case str[i] of
             'A'..'Z', 'a'..'z' : Result := Result + str[i];
             '0'..'9'          : Result := Result + str[i];
             ' '               : Result := Result + str[i];
          end;
       end;
    end;
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 409
    Points : 5 799
    Points
    5 799
    Par défaut
    salut

    argh j'ai jamais vu en code aussi mal ecrit
    bon a part ca
    il faut que tu creer un fonction en dehors de ta procedure

    genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     Fonction DeletespecChar(avalue : String ) : String;
      var
         i :longint;
      begin
        Result := '';
        for i := 1 to Length(avalue)    do
        begin
           Case avalue[i] of
              'A'..'Z', 'a'..'z' : Result := Result + avalue[i];
              '0'..'9'          : Result := Result + avalue[i];
              ' '               : Result := Result + avalue[i];
           end;
       end;
    est dans ton code tu remplace ce que tu as fait par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      str := DeletespecChar(str)
    PS : on me derange cinq minute et voila que quelqu'un fournit la meme reponse j'y croit pas y'a pas de justice
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 426
    Points : 24 790
    Points
    24 790
    Par défaut
    Tient, voici un code 1000 fois plus rapide que celui proposé, bon je l'ai adapté rapidement ce matin donc quelques bugs peuvent survenir, me les signaler que je corrige ...

    C'est une fonction optimisée que j'ai écrite sur l'idée de la fonction ExtractStrings (Classes.pas de Delphi) pour l'utilisation de TSysCharSet.
    Fabrice ROUXEL qui devrait publié prochainement une QR a eu la même idée mais dans l'autre sens, il a fait une fonction qui retire les caractères (c'est juste le paramètre qui change finalement) dans une chaine

    Code de Fabrice ROUXEL + SJRD :
    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
    function DeleteFromStr(const Str : string; Excluded : TSysCharSet) : string;
    var Len, I, J : integer;
    begin
      Len := Length(Str);
      SetLength(Result, Len);
      J := 0;
      for I := 1 to Len do
      begin
        if not (Str[i] in Excluded) then
        begin
          inc(J);
          Result[J] := Str[i];
        end;
      end;
      SetLength(Result, J);
    end;
    Dans ton cas les CharSet risque d'être très long, ainsi l'approche inverse sera plus pratique avec ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ResStr := CopyStringOnly('cou4co75u 4l782a 4523Fran45234c789e34!', ['a'..'z', 'A'..'Z', ' ', '!']);

    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
    function CopyStringOnly(const Str : string; const OnlyChars : TSysCharSet): string;
    type
      TSCSALOON = record
        case Boolean of
          True: (SCS: TSysCharSet);
          False: (A: Array[1..8] of Cardinal);
        end;
    var
       Len, I : integer;
       J, P: PChar;
    begin
      Len := Length(Str);
      if Len = 0 then
      begin
        Result := '';
        Exit;
      end;
      with TSCSALOON(OnlyChars) do
      begin
        if (A[1] = 0) and (A[2] = 0) and (A[3] = 0) and (A[4] = 0) and (A[5] = 0) and (A[6] = 0) and (A[7] = 0) and (A[8] = 0) then
        begin
          Result := '';
          Exit;
        end;
      end;
     
      SetLength(Result, Len);
      P := @Result[1];
      J := P;
      for I := 1 to Len do
      begin
        if Str[i] in OnlyChars then
        begin
          J^ := Str[i];
          Inc(J);
        end;
      end;
      ReduceStr(Result, Cardinal(J) - Cardinal(P));
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure ReduceStr(var S: string; NewLength: Integer);
    type
       PStrRec = ^StrRec;
       StrRec = packed record
          refCnt: Longint;
          length: Longint;
       end;
    begin
       if NewLength < Length(S) then
       begin
         S[Succ(NewLength)] := #0;
         PStrRec(Integer(S) - SizeOf(StrRec)).length := NewLength;
       end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Merci beaucoup pour vos réponses.

    Mais j'ai 2 messages d'erreurs.

    Undeclared indentifier : 'ReduceStr'
    Undeclared indentifier : 'ResStr'

    Quand penser vous ?

    Merci

  7. #7
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Pour ReduceStr, c'est la fonction que t'as donné ShaiLeTroll :

    Code de ShaiLeTroll : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure ReduceStr(var S: string; NewLength: Integer);
    type
       PStrRec = ^StrRec;
       StrRec = packed record
          refCnt: Longint;
          length: Longint;
       end;
    begin
       if NewLength < Length(S) then
       begin
         S[Succ(NewLength)] := #0;
         PStrRec(Integer(S) - SizeOf(StrRec)).length := NewLength;
       end;
    end;

    Ensuite pour ResStr, il faut le déclarer comme étant de type String.

    En espérant t'avoir aidé.
    A+

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Re bonjour,

    Merci pour les infos, effectivement je n'ai plus d'erreurs.

    Malheureusement cela ne fonctionne toujours pas

    Je met le code modifier en PJ


    Et encore merci d'avance
    Fichiers attachés Fichiers attachés

  9. #9
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Re,

    Pour que je puisse tester, comment on se sert de ton outil

    J'ai compris qu'il fallait mettre JSInd.exe C:\UnRep UnSiteWeb mais en faite, je ne comprends pas trop le fonctionnement car il me crée un fichier js et on dirait qu'il lit tout mon DD.

    J'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JSInd.exe C:\ Http://www.google.fr
    Peux tu m'en dire plus stp ?
    Merci

    (Ca à l'air intéressant comme outil )

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Effectivement, c'est pour cela que j'essaye de l'exploiter.

    jsind.exe <Main_Directory> <Web_Root>

    Ex en local : c:\jsind\jsind.exe c:\tr ../tr (c:\tr repertoire contenant fichier htm ou txt .... ../tr chemin relatif pour la création des lien) puis création d'un js indexer.


    Voilà

    Slts

  11. #11
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Dans ton code, tu utilises bien la fonction, et tu mets bien le contenu dans la variable ResStr mais tu ne l'utilises pas par la suite !

    J'ai essayé le code de ShaiLeTroll est ça fonctionne très bien.
    Pour exemple, j'ai fait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button1Click(Sender: TObject);
    var
      A:string;
      B:String;
    begin
      A:='azeré&!è';
      B:=CopyStringOnly(A,['a'..'z', 'A'..'Z', ' ', '!']);
      ShowMessage(B); // Affiche azer!
    end;
    A+

  12. #12
    Membre à l'essai
    Inscrit en
    Septembre 2002
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Juste ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    str := StringReplace(str, 'é', 'e', rfReplaceAll);
    str := StringReplace(str, 'è', 'e', rfReplaceAll);
    str := StringReplace(str, '!', ' ', rfReplaceAll);
    ...
    voilà.

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 426
    Points : 24 790
    Points
    24 790
    Par défaut
    Ta Solution bhf37 remplace les caractères accentués par les caractères non accentués, alors que l'on les retiré !

    mais on peut donc dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    str := StringReplace(str, 'é', '', rfReplaceAll);
    str := StringReplace(str, 'è', '', rfReplaceAll);
    str := StringReplace(str, '!', '', rfReplaceAll);
    c'est juste 1000 fois plus lent que CopyStringOnly
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    En tous cas un grand merci à vous tous j'ai opté pour la solution de ShaiLeTroll avec la fonction :

    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
     
    function DeleteFromStr(const Str : string; Excluded : TSysCharSet) : string;
    var Len, I, J : integer;
    begin
      Len := Length(Str);
      SetLength(Result, Len);
      J := 0;
      for I := 1 to Len do
      begin
        if not (Str[i] in Excluded) then
        begin
          inc(J);
          Result[J] := Str[i];
        end;
      end;
      SetLength(Result, J);
    end;
    Que j'utilise comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    ResStr := DeleteFromStr(str, ['‚','ƒ','…','=','{','}','-','\',')','|','/','','','ÿ','&','#','&',',','','+','*','"','~',';','^','`','%','','','','&','@','(','','>','€','?','$','„','†','‡','ˆ','‰','Š','‹','Œ','Ž','‘','’','“','”','•','–','—','˜','™','š','›','œ','ž','Ÿ','¡','¢','£','¤','¥','¦','§','¨','©','ª','«','¬','*','®','¯','°','±','²','³','´','µ','¶','·','¸','¹','º','»','¼','½','¾','¿','Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Õ','Ö','×','Ø','Ù','Ú','Û','Ü','Ý','Þ','ß','á','ã','ä','å','æ','ë','ì','í','î','ï','ð','ñ','ò','ó','õ','ö','÷','ø','ù','ú','û','ü','ý','þ','ÿ','[']);
     
    str := ResStr;
    Cela me va nickel

    Merci

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

Discussions similaires

  1. Supprimer les caractéres spéciaux d'une chaine
    Par hugoclo dans le forum VB.NET
    Réponses: 15
    Dernier message: 23/12/2010, 09h29
  2. Réponses: 12
    Dernier message: 16/05/2008, 11h47
  3. Réponses: 4
    Dernier message: 24/08/2005, 19h40
  4. [Jsp] Supprimer les caractère spéciaux d'une chaine
    Par PeteMitchell dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 13/05/2004, 12h11
  5. [Tomcat] Comment supprimer tous les logs ?
    Par Soulsurfer dans le forum Tomcat et TomEE
    Réponses: 8
    Dernier message: 11/05/2004, 17h35

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