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 :

Autoriser le retour à la ligne dans un preg_match [RegEx]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Developpeur amateur
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur amateur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Points : 26
    Points
    26
    Par défaut Autoriser le retour à la ligne dans un preg_match
    Bonjour,

    Dans un formulaire avec un champs texte, je souhaite autoriser les caractères habituels, ainsi que les retours à la ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <label>Texte</label>
    <textarea id='zonetexte' type="text" name="texte" placeholder="Texte de l'annonce" autocomplete="off" maxlength="<?php echo $longueurmaxannonce; ?>" /></textarea>
    J'utilise donc une vérification avec le preg_match suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (!preg_match('/^[a-z0-9áàâçéèêëïôöùü\s\-\,\!\?\.\;\/\:\%\*\(\)\"\'\&\+\=\°\€\£\$\@\_]+$/i', $texte)) {
    echo 'L\'annonce saisie contient un ou des caractères interdits.';
    Tout semble fonctionner correctement, à l'exception du retour à la ligne qui reste considéré comme interdit malgré le \s
    Ainsi, quand je fais un essai avec un retour à la ligne j'obtiens :
    L'annonce saisie contient un ou des caractères interdits.
    Chose curieuse, quand je teste sur regex101.com, le retour à la ligne est accepté :
    https://regex101.com/r/lC5sQ6/4

    Je ne comprends pas pourquoi ça ne fonctionne pas sur mon site, et je ne vois pas de solution.
    Merci pour votre aide

  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
    De but en blanc, il n'y a aucune raison que les nouvelles lignes soient refusées. Es-tu sûr qu'il n'y a pas de conversion du contenu du textarea en html (par exemple) avant que tu effectues le test.

    Tu devrais poster des exemples de chaînes qui pose problème ainsi que la valeur de $texte juste avant le test (voire même le code PHP qui part de la récupération de la valeur du textarea jusqu'au teste en question).

    Au passage tu peux enlever tous les antislashs de ta pattern mis à part celui du s, celui du slash et du quote simple car ils sont inutiles, et ajouter le modificateur u vu que ta pattern et potentiellement ta chaîne contiennent des caractères en dehors de la plage ASCII.

    NB: au lieu d'essayer de recenser tous les caractères accentués possibles et imaginables, tu peux utiliser \p{Latin} qui les contient tous (bon, il y aura en plus des lettres ou des accents qui n'existent pas en français, mais est-ce vraiment grave? Moi je pense que c'est mieux que d'en oublier les trois quarts)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Developpeur amateur
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur amateur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Points : 26
    Points
    26
    Par défaut
    Merci pour ta réponse. Alors le $texte est récupéré juste au dessus comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $texte = mysqli_real_escape_string($link, strip_tags($_POST['texte'], ENT_QUOTES));
    Et j'ai mis 2 var_dump comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var_dump($texte);
    var_dump(!preg_match('/^[a-z0-9áàâçéèêëïôöùü\s\-\,\!\?\.\;\/\:\%\*\(\)\"\'\&\+\=\°\€\£\$\@\_]+$/i', $texte));
    Ce qui me donne :

    string(42) "Ceci est un test de\r\nretour à la ligne." bool(true)
    Sinon merci pour les conseils sur les \ et le \p{Latin}, c'est la première fois que j'utilise les preg_match

  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
    Eh bien dans ce cas la réponse est simple: si tu as dans ta chaîne une nouvelle ligne soit la séquence de caractère CR LF (pour windows) qu'on peut représenter par \r\n quand on l'écrit dans une chaîne entre quote double, mysqli_real_escape_string() va la transformer en quatre caractères distincts (au lieu de deux): un antislash, un "r", un antislash, un "n". Comme ta classe de caractères ne contient pas l'antislash, la pattern échoue.

    Solution: applique mysqli_real_escape_string() après le test, pas avant (par contre fait le strip_tags avant).
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Developpeur amateur
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur amateur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Points : 26
    Points
    26
    Par défaut
    Effectivement j'avais pas pensé à ça. Merci beaucoup

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

Discussions similaires

  1. [Swing]Retour à la ligne dans un JTextArea
    Par Nasky dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 09/03/2006, 20h02
  2. [C#] Retour à la ligne dans un textbox
    Par Oberown dans le forum Windows Forms
    Réponses: 8
    Dernier message: 26/07/2005, 09h46
  3. [C#] Retour à la ligne dans un TextBox MultLine
    Par Oberown dans le forum ASP.NET
    Réponses: 3
    Dernier message: 06/07/2005, 11h39
  4. retoure à la ligne dans un fichier
    Par adilou1981 dans le forum Langage
    Réponses: 4
    Dernier message: 02/12/2004, 15h05
  5. [MFC] Retour à la ligne dans un CEdit
    Par Kant dans le forum MFC
    Réponses: 7
    Dernier message: 18/02/2004, 08h58

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