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

Zend_Form PHP Discussion :

[1.5.3][Zend_Form]Encore un problème avec les filters et les accents


Sujet :

Zend_Form PHP

  1. #1
    Membre éclairé
    Avatar de Dia_FR
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2006
    Messages : 512
    Points : 708
    Points
    708
    Par défaut [1.5.3][Zend_Form]Encore un problème avec les filters et les accents
    bonjour

    pour commencer, j'ai déjà recherché sur ce forum et d'autres et j'ai testé différentes solutions proposées (ex: iconv_set_encoding('internal_encoding', 'utf-8'); ou les modifs de config de mb_string dans le php.ini), rien à faire

    le problème : le filtre Alnum ne valide pas un champ contenant des accents

    Mon appli n'est pas UTF-8, tout est en ISO (BD, fichiers, charsets Http...) donc si je fais ça, le filtre passe mais à la sortie du filtre ça me sort une chaine pourrie du genre "été" pour "été"

    de plus j'aimerai bien ne pas avoir à encoder mes données à chaque fois

    y a t il un moyen de faire comprendre les accents aux filtres en restant avec un charset ISO ?

    merci d'avance

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Août 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 2
    Points : 0
    Points
    0
    Par défaut le regexp pour utf-8 (Validate et Filter )
    Si comme moi vous aviez pleuré, imploré tous les saints de la recherche ( G & Y )...
    voici comment je m'en suis sorti.
    Contexte : je travaille en utf-8 de bout en bout ( navigateur, serveur web, pages servies, database, et encodage des scripts php phtml )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $text_pattern = '/^[\p{L} 0-9\.\-_\,\;\:\'\(\)\*\#\€\+\=\%\@\&\!\?\^\[\]\{\}\"\/\\s]+$/';
            $validatorRegExText = new Zend_Validate_Regex($text_pattern);
            $validatorRegExText->setMessage(__('label_error_regex'));
    Avec ça j'accepte presque tout :-)

  3. #3
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Salut,

    Je pense que le problème vient de cette section de code de Zend_Filter_Alnum :
    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
        public function filter($value)
        {
            $whiteSpace = $this->allowWhiteSpace ? '\s' : '';
            if (!self::$_unicodeEnabled) {
                // POSIX named classes are not supported, use alternative a-zA-Z0-9 match
                $pattern = '/[^a-zA-Z0-9' . $whiteSpace . ']/';
            } else if (extension_loaded('mbstring')) {
                // Unicode safe filter for the value with mbstring
                $pattern = '/[^[:alnum:]'  . $whiteSpace . ']/u';
            } else {
                // Unicode safe filter for the value without mbstring
                $pattern = '/[^\p{L}\p{N}' . $whiteSpace . ']/u';
            }
     
            return preg_replace($pattern, '', (string) $value);
        }
    Quel que soit le branchement, aucun des patterns ne prend en compte le cas, rendu possible par Unicode, où un caractère accentué est encodé en 2 "code point", la lettre + l'accent (par exemple, à = U+0061 (a) + U+00E0 (l'accent grave). Pour valider cette hypothèse, il faudrait tester le filtre sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public function filter($value)
        {
            $whiteSpace = $this->allowWhiteSpace ? '\s' : '';
            $pattern = '/[^\p{L}\p{M}\p{N}' . $whiteSpace . ']/u';
            return preg_replace($pattern, '', (string) $value);
    \p{M} désigne un signe diacritique (mark).

  4. #4
    Membre éclairé
    Avatar de Dia_FR
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2006
    Messages : 512
    Points : 708
    Points
    708
    Par défaut
    ouais 'fin moi comme j'ai dit, je dois utiliser l'ISO, pas l'UTF
    du coup je me suis fait un validateur perso :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    require_once 'Zend/Filter/Alnum.php';
     
    class Fxc_Filter_Alnum
    extends Zend_Filter_Alnum
    {
        public function filter($value)
        {
            $whiteSpace = $this->allowWhiteSpace ? '\s' : '';
    		$pattern = '/[^a-zA-Z0-9' . $whiteSpace . 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿ]/';
            return preg_replace($pattern, '', (string) $value);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    require_once 'Zend/Validate/Alnum.php';
    require_once 'Fxc/Filter/Alnum.php';
     
    class Fxc_Validate_Alnum
    extends Zend_Validate_Alnum
    {
    	public function isValid($value)
    	{
    		self::$_filter = new Fxc_Filter_Alnum();
    		return parent::isValid($value);
    	}
    }

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

Discussions similaires

  1. Encore des problèmes avec le BDE
    Par Flint dans le forum C++Builder
    Réponses: 19
    Dernier message: 31/12/2007, 23h26
  2. Urgent : Encore un problème avec un DbDataReader
    Par Nadiya dans le forum Windows Forms
    Réponses: 6
    Dernier message: 11/06/2007, 09h03
  3. Encore un problème avec Scyte et gets
    Par alixbasix dans le forum Ruby
    Réponses: 10
    Dernier message: 02/03/2007, 15h25
  4. Réponses: 6
    Dernier message: 22/01/2007, 11h43
  5. Encore un problème avec netscape !!
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 06/02/2006, 21h14

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