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

REGEX echappement caractères speciaux!


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur électromécanicien
    Inscrit en
    Septembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur électromécanicien
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 35
    Par défaut REGEX echappement caractères speciaux!
    Bonjour à toutes et à tous.

    Les REGEX (validation date) suivantes ne fonctionnent pas en ligne bien qu'elle fonctionnent en local avec wampserver.
    D'après les testes que j'ai effectués le problème vient de l'utilisation du slash malgrè que je l'ai echappé de deux façons mais sans résultat.

    /^(0[1-9]|[1-2][0-9]|3[01])(\/|-)(0[1-9]|1[0-2])(\/|-)([2-9][0-9]|20[2-9][0-9])$/
    /^(0[1-9]|[1-2][0-9]|3[01])([/]|-)(0[1-9]|1[0-2])([/]|-)([2-9][0-9]|20[2-9][0-9])$/

    NB: En remplaçant le slash par un underscore (_) le problème est résolu, mais je trouve que ce n'est pas trop comode pour une date!!!.

    https://winsem.net/IniWeb/Php-Expres...php#DivRsltEx4

    Svp de l'aide
    Amplement Merci.

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur électromécanicien
    Inscrit en
    Septembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur électromécanicien
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 35
    Par défaut
    Bonsoir à tous.

    J'ai changé les slashs délimiteurs par des ~ et j'ai gardé les slashs au niveau date et le problème est résolu.
    Il parait que la version php sur mon serveur n'accepte pas l'échappement des slashs !!!

    J"attend quand même des avis des plus expérimentés en la matière.

    Merci.

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Les caractères spéciaux dans les regex sont toujours un calvaire, qu'il faut traiter au cas par cas en fonction de l'outil que tu utilises. Ainsi, si une regex "simple" peut être la même pour la plupart des outils/langages, il faut vraiment l'adapter pour python/perl/vim/php/grep/...

    Pour ton cas, je serai surpris qu'il n'existe pas un moyen d'échapper les / :
    • //
    • '/'
    • "/"
    • \/
    • [/]{1}
    • \</\>
    • ...
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    La syntaxe des regex n'est pas exactement la même d'un langage à l'autre.
    Je vous conseillerais de tester votre regex sur https://regex101.com/ avec différentes valeurs.
    Avant de réinventer la route, vous pouvez effectuer une recherche du genre "regex yyy-mm-dd", en indiquant le format de date que vous voulez valider. A mon avis, on peut simplifier mais je ne suis pas 100% sûre de ce que vous avez voulu faire.

    Si on est dans le cadre d'un input utilisateur, vouloir accommoder plusieurs formats me semble relativement hasardeux. Il faut bien imposer un minimum de rigueur, ou passer par des interfaces telles que des calendriers en JS/CSS, et là on peut même varier le format de saisie et d'affichage en fonction du locale de l'utilisateur.

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    Citation Envoyé par kader53 Voir le message
    J'ai changé les slashs délimiteurs par des ~ et j'ai gardé les slashs au niveau date et le problème est résolu.
    C'était la meilleure chose à faire.

    Il parait que la version php sur mon serveur n'accepte pas l'échappement des slashs !!!
    Ça par contre c'est n'importe quoi. Le soucis doit être ailleurs.

    Pour information, le slash n'est pas un "caractère spécial", il ne doit être échappé que lorsqu'il est utilisé pour délimiter la pattern. Les 12 caractères spéciaux à échapper sont: . ? * + ( ) [ { ^ $ | \ (et encore, la plupart du temps, il est inutile d'échapper l'accolade ouvrante {). Et s'il est vrai que la plupart d'entre eux perdent leur sens spécial à l'intérieur d'une classe de caractères, le délimiteur de la pattern doit lui toujours être échappé.

    Quelques remarques sur les patterns:
    • éviter les alternatives de caractères uniques: (a|b|c). Dans ce cas mieux vaut une classe de caractères: [abc]
    • Ne pas écrire [1-2] car il n'y a rien entre 1 et 2 donc pas la peine de définir un rang de caractères: [12] suffit.
    • Lorsque la pattern devient longue, ne pas hésiter à utiliser le modificateur x qui permet d'ignorer les espaces de la pattern. Ce qui permet de l'écrire de manière plus lisible.
    • Préfèrer au couple ^ $ pour les limites de la chaîne sujet, le couple \A \z qui est moins traitre. En effet le $ ne matche pas toujours la fin de la chaîne et peut réussir avant un saut de ligne final. Exemple:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      var_dump(preg_match('~^a$~', "a\n")); // int(1)
      var_dump(preg_match('~\Aa\z~', "a\n")); // int(0)
      var_dump(preg_match('~^a$~D', "a\n")); // int(0) (le modificateur D force $ à matcher uniquement la fin de la chaîne)
    • Les parenthèses dans une pattern créent des groupes de capture, si tu n'as pas besoin de ces captures, tu peux utiliser des groupes non-capturant à la place: (?: ... ), et réserver les groupes capturants lorsque tu en as besoin (pour extraire une partie de la chaîne). (Il est aussi possible de désactiver toutes les captures de la pattern avec le modificateur n, dans ce cas, seules les captures nommées sont prises en compte)
    • Les captures auraient toute leur utilité pour t'assurer que les éléments de la date sont toujours séparés avec le même caractère (le tiret ou le slash et pas un mix des deux) en capturant la première occurrence et en utilisant une référence à cette capture pour la deuxième. Exemple: ~\A[0-9]{2}([/-])[0-9]{2}\1[0-9]{4}\z~ ici \1 est la référence à la capture 1.


    En prenant tout ça en compte, ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $pattern = '~ \A
        (?: 0 [1-9]  |  [12] [0-9]  |  3 [01] )
        ( [/-] )
        (?: 0 [1-9]  |  1 [0-2] )
        \1
        (?: 20 )? [2-9] [0-9]
    \z~x';
    Il faut bien garder en tête qu'une pattern se contente de vérifier un format de chaîne, elle ne se pleindra pas d'un 31 avril et se moque des années bissextiles, ça n'est pas son boulot.

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    La raison pour laquelle ton échappement du slash avec un antislash ne marche pas c'est que tu l'injectes dans ton code html avec value="<?php echo $RegexDat1; ?>". Or ce faisant, l'antislash disparait (affiche le code source html dans ton navigateur). Pour représenter un antislash dans une chaîne PHP, il faut le doubler: echo '\\';

  7. #7
    Membre expérimenté
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juin 2014
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2014
    Messages : 461
    Par défaut
    Bonjour. Comme expliqué plus haut « Il faut bien garder en tête qu'une pattern se contente de vérifier un format de chaîne, elle ne se pleindra pas d'un 31 avril et se moque des années bissextiles »

    C'est pourquoi PHP a intégré une fonction de vérification de date sure. Cependant celle-ci attend trois paramètres dans cet ordre : le mois, le jour et l'année.
    On peut vérifier une date de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    list($jour, $mois, $an) = explode('/', $date);
    if(checkdate($mois, $jour, $an)) // la date est correcte
    Maintenant, les dates doivent être enregistrées selon ce schéma en SQL : 2000-12-31
    Je ferais donc ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    list($jour, $mois, $an) = explode('/', $date);
    if(checkdate($mois, $jour, $an)) $date = "$an-$mois-$jour";

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    le - en langage regex est utilisé pour un range 0-9 => de 0 à 9 ...

    il suffit de l'échapper avec un \ et selon le cas en doublant l'antislash ...
    sinon en le mettant seul dans une classe [-]
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

Discussions similaires

  1. [RegEx] regex cherchant des caractères speciaux
    Par mattmax dans le forum Langage
    Réponses: 2
    Dernier message: 23/04/2018, 15h56
  2. [C# 2.0]Problème de caractères speciaux
    Par Tatanne dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/07/2006, 02h51
  3. Probleme de lecture d'un fichier avec caractères speciaux
    Par bygui dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 26/06/2006, 09h35
  4. Caractéres speciaux
    Par cerede2000 dans le forum Langage
    Réponses: 4
    Dernier message: 04/05/2006, 15h11
  5. delphi XML / HTML caractéres speciaux !
    Par adem dans le forum EDI
    Réponses: 2
    Dernier message: 29/08/2002, 17h48

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