Fonction de remplacement de caractères

Signaler
Messages postés
9
Date d'inscription
mercredi 9 juillet 2008
Statut
Membre
Dernière intervention
14 juillet 2010
-
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
-
Bonjour à tous.
Je viens de faire ce code en vb.net ce matin. Je débute et j'ai pas les idées très claires à cette heure-ci.
Quelqu'un pourrait-il jeter un oeil à mon code svp ?
Je devrais utiliser une structure avec un select case mais je ne vois pas commment faire car la valeur de mon pattern varie chaque fois.

 Function f_replace_char(ByRef test_string As String)

        Dim pattern As String = "'"
        Dim m As Match = Regex.Match(test_string, pattern)

        If m.Success = True Then
            test_string = Replace(test_string, pattern, "''")
        End If

        pattern = ";"
        If m.Success = True Then
            test_string = Replace(test_string, pattern, "''")
        End If

        pattern = "--"
        If m.Success = True Then
            test_string = Replace(test_string, pattern, "''")
        End If

        pattern = "/*"
        If m.Success = True Then
            test_string = Replace(test_string, pattern, "''")
        End If

        pattern = "*/"
        If m.Success = True Then
            test_string = Replace(test_string, pattern, "''")
        End If

        pattern = "xp_"
        If m.Success = True Then
            test_string = Replace(test_string, pattern, "''")
        End If

        Return test_string
    End Function


C'est juste un essai. Je sais que le code n'est pas correct. C'est juste une idée en passant pour nettoyer les chaînes de caractères afin d'éviter les injections SQL. Il me faut juste un petit coup de pouce

6 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
du grand n'importe quoi...

tu mets a jour ta variable pattern, qui n'est pas liée, en aucune facon à m (RegExp)
tu fais donc n fois le même m.Success

et tu fais un Replace (String)
et non un Regplace Regexp (via une des methodes de m)

enfin, puisque le but du jeu est de emplacer tout ces patterns par ''
tu peux le faire en trois lignes de code !


Pour éviter les injections SQL, ne fais pas de constructions :

" ... WHERE login='" & maVar & "' "

passe par des requetes parametrées...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
140
Date d'inscription
mardi 25 novembre 2003
Statut
Membre
Dernière intervention
1 novembre 2010
5
Bonjour,
pas besoin d'un Select Case, il suffit de regrouper toutes les chaînes string dans le Pattern.
"(')+|(;)+|(--)+|(/\*)+|(\*/)+|(xp_)+"

Entre-parenthèse se trouve la chaîne à chercher.
A noter l'antislash "" permet de chercher un méta-caractère(# ! ^ $ ( ) [ ] { } | ? + * . \) dans sa valeur littérale
Le "+" signifie 1 ou plusieurs.
Le "|" veut dire "ou"

Enfin pour remplacer, code suivant à tester :
    Function f_replace_char(ByRef test_string As String) As String

        Dim pattern As String
        Dim m As Match

        pattern = "(')+|(;)+|(--)+|(/\*)+|(\*/)+|(xp_)+"
        m = Regex.Match(test_string, pattern)
        test_string = Regex.Replace(test_string, pattern, "''")

        Return test_string
    End Function
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
nul besoin du +

se simplifie du coup ainsi :

"(')+|(;)+|(--)+|(/\*)+|(\*/)+|(xp_)+"

en

"[';]|(--)|(/\*)|(\*/)|(xp_)"

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
140
Date d'inscription
mardi 25 novembre 2003
Statut
Membre
Dernière intervention
1 novembre 2010
5
Bonsoir,
Je débute
dit il.
Renfield, votre réponse vient à point en complément.
Pour ma part j'ai voulu marquer le coup :
(chaîne recherchée) quantifieur ou (autre chaîne recherchée)quantifieur ou etc...
Messages postés
9
Date d'inscription
mercredi 9 juillet 2008
Statut
Membre
Dernière intervention
14 juillet 2010

Merci pour vos réponses !

Ah dire vrai, cela faisait 9 mois que je ne faisais plus que du réseau et donc que je ne programmais plus. Difficile le retour aux sources...

Je vais me renseigner sur les expressions régulières puisque j'ai des lacunes sur ce sujet.
Visiblement le caractère | permet de mettre plusieurs expressions dans le pattern. Si seulement j'y avais pensé avant...
Donc je note l'antislash avant le backslash.

Par contre je n'ai pas compris pourquoi mettre cette expression entre crochets [';]

Voilà les recommandations de Microsoft concernant les injections SQL : Lien

Je ne sais pas si leurs conseils s'appliquent aussi pour le like si je construis mes requêtes en Linq comme ceci :

Imports System.Data.Linq.SqlClient

...

        Dim context As classe_linqDataContext = New classe_linqDataContext
        Dim t_person As Linq.Table(Of linq_application.Person) = context.Person

        Dim s_search As String = "kim"
        Dim s_start As String = "ki"
        Dim s_end As String = "im"
        Dim s_joker As String = "%"
        Dim s_char As String = "_"

        Dim q_like_start_1 = From q In t_person Where SqlMethods.Like(q.FirstName, s_start + s_joker) Select q.FirstName
        Dim q_like_start_2 = From q In t_person Where SqlMethods.Like(q.FirstName, s_start + s_char) Select q.FirstName
        Dim q_like_end_1 = From q In t_person Where SqlMethods.Like(q.FirstName, s_joker + s_end) Select q.FirstName
        Dim q_like_end_2 = From q In t_person Where SqlMethods.Like(q.FirstName, s_char + s_end) Select q.FirstName
        Dim q_like_search = From q In t_person Where SqlMethods.Like(q.FirstName, s_joker + s_search + s_joker) Select q.FirstName



J'ai utilisé cette façon car le code en dessous ne permet pas d'intégrer les recherche avec le % ou _
Mais j'aurais pu aussi utiliser le startwith ou endwith.

        Dim q_like_exact = From q In t_person Where q.FirstName Like s_search


Qu'en pensez vous ?
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
regarde pas le code de MS, ils jouent avec LINQ

pour les regexp, voir:

http://regex.codes-sources.com/

pour [';]
c'est la base

signifie '|;


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp