Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
bonjour
pour commencer, oui, j'ai bien fait une recherche à "accent" et "accents" sur le forum 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
j'ai vu ce post : http://www.z-f.fr/forum/viewtopic.php?id=579
mais de mon côté, 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
Hors ligne
Réécrire un filtre à base de bête copié coller fait l'affaire.
Voilà pour t'inspirer un petit filtre que j'ai fait vite fait qui me dépanne de temps en temps...
Il accepte en fait du texte, à toi de réglé les caractères "spéciaux" que tu veux, le code n'est pas bien compliqué tu devrais t'en sortir
<?php /** * Rewix extension for Zend Framework * * LICENSE * * This source file is subject to the new BSD license that is bundled * with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://www.rewix.com/license/new-bsd * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to contact@rewix.com so we can send you a copy immediately. * * @category Rx * @package Rx * @copyright Copyright (c) 2007 Rewix (http://www.rewix.com) * @license http://www.rewix.com/license/new-bsd New BSD License */ require_once 'Zend/Filter/Interface.php'; class Rx_Filter_Text implements Zend_Filter_Interface { /** * Is PCRE is compiled with UTF-8 and Unicode support * * @var mixed **/ protected static $_unicodeEnabled; /** * Special charateres autorised (not really special) * * @var String */ protected static $_specialChars = '\?\.,;:\/!€£$=\*\+\-\(\)\{\}\[\]&\#~\"\'\|`‘’«»\\\^@°%µø<>'; /** * Accentued charateres autorised * * @var String */ protected static $_accentuedChars = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöœøùúûýýþÿ'; /** * Sets default option values for this instance * * @param boolean $allowWhiteSpace * @return void */ public function __construct() { if (null === self::$_unicodeEnabled) { self::$_unicodeEnabled = (@preg_match('/\pL/u', 'a')) ? true : false; } } /** * Defined by Zend_Filter_Interface * * Returns the string $value, removing all but alphabetic and digit characters * * @param string $value * @return string */ public function filter($value) { if (!self::$_unicodeEnabled) { // POSIX named classes are not supported, use alternative a-zA-Z0-9 match $pattern = '/[^a-zA-Z0-9\s' . self::$_accentuedChars . self::$_specialChars . ']/'; } else if (extension_loaded('mbstring')) { // Unicode safe filter for the value with mbstring $pattern = '/[^[:alnum:]\s' . self::$_accentuedChars . self::$_specialChars . ']/u'; } else { // Unicode safe filter for the value without mbstring $pattern = '/[^\p{L}\p{N}\s' . self::$_accentuedChars . self::$_specialChars . ']/u'; } return preg_replace($pattern, '', (string) $value); } }
Hors ligne
merci pour ta réponse
effectivement, ré-écrire un filtre en utilisant les existants était ce qui me paraissait le plus simple
ce qui me gène quand on copie/colle du code depuis le ZF vers des librairies persos c'est qu'on est dépendant de l'évolution du code du ZF (= faut penser à mettre à jour nos copies de code aussi)
bref
j'ai donc utilisé ta solution pour me redéfinir la validateur Alnum :
require_once 'Zend/Filter/Alnum.php'; class Fxc_Filter_AlnumAccents extends Zend_Filter_Alnum { /** * caractères accentués autorisés * */ protected static $_accentuedChars = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿ'; /** * redéfinition pour accepter les caractères accentués * */ 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 . self::$_accentuedChars . ']/'; } else if (extension_loaded('mbstring')) { // Unicode safe filter for the value with mbstring $pattern = '/[^[:alnum:]' . $whiteSpace . self::$_accentuedChars . ']/u'; } else { // Unicode safe filter for the value without mbstring $pattern = '/[^\p{L}\p{N}' . $whiteSpace . self::$_accentuedChars . ']/u'; } return preg_replace($pattern, '', (string) $value); } }
sauf qu'à l'affichage de mon formulaire (même pas à la soumission mais directement au 1er affichage), il me sort :
Warning: preg_replace() [function.preg-replace]: Compilation failed: invalid UTF-8 string at offset 12 in C:\wamp\www\fXCv4\library\Fxc\Filter\AlnumAccents.php on line 32
ce qui correspond à la ligne "return preg_replace($pattern, '', (string) $value);"
si je mets $_accentuedChars à chaine vide, ça passe
pour rappel je suis en ISO
j'ai testé en faisant un utf8_encode de $_accentuedChars avant d'inclure les caractères dans le pattern mais en faisant ça, je me retrouve avec le même problème qu'au début (cf 1er post)
comme ça là je vois pas trop... si tu as une idée, j'en serai ravi
merci
edit :
dans mon cas, le pattern utilisé est le 2ème :
$pattern = '/[^[:alnum:]' . $whiteSpace . self::$_accentuedChars . ']/u';
le problème viendrait du "/u" ?
Dernière modification par Dia (25-08-2008 16:10:52)
Hors ligne
ouais, ISO, que ce soit les fichiers ou l'encodage de l'HTML servi au client
d'ailleurs quand j'ai repris ta liste de caractères accentués, j'ai du virer le "e dans le o" car ce carac n'est pas reconnu ISO apparemment, il empêchait l'enregistrement du fichier
Dernière modification par Dia (26-08-2008 08:45:12)
Hors ligne
ouais
Hors ligne
Pages: 1