Hi grigri,
I've just tried your solution : as in : `/^\w+$/`
It doesn't work... if I type some French accented characters or "-" in
an input called "prenom".
Here is my $validate rule :
public $validate = array(
'prenom' => array(
'minLength' =>
array(
'rule' => array('minLength','2'),
'message'=>'My error message 1'
),
'custom' =>
array(
'rule' => '/^\w+$/',
'message' => 'My error message 2'
)
)
On 8 avr, 14:04, grigri <[EMAIL PROTECTED]> wrote:
> For a locale-based solution, has anyone tried just using the \w
> metachar, as in : `/^\w+$/` ?
>
> According to the php docs:
>
> > A "word" character is any letter or digit or the underscore character,
> > that is, any character which can be part of a Perl "word".
> > The definition of letters and digits is controlled by PCRE's character
> > tables,
> > and may vary if locale-specific matching is taking place.
> > For example, in the "fr" (French) locale, some character codes
> > greater than 128 are used for accented letters, and these are matched by \w.
>
> Does this work?
>
> On Apr 8, 6:54 am, Max Romantschuk <[EMAIL PROTECTED]> wrote:
>
> > Having run into this issue myself, I created a Latin-9 compatible
> > validation function for alphanumeric data. Our system is not using
> > Unicode, so you need to be using Latin-9 (ISO-8859-15) for your
> > CakePHP installation and database. I assume the approach could be
> > adapted to UTF-8 quite easily.
>
> > I chose to use a function to generate the characters I need for the
> > regexp, as keeping the actual code ASCII makes it immune to encoding
> > issues. I decided to keep my "magic string" as a global constant, but
> > encapsulating it into the validation function would work as well.
>
> > === Put in bootstrap.php -- STARTS ===
>
> > // Special non-ascii characters for encoding-proof usage.
> > global $LATIN_9_EXTCHARS;
> > $LATIN_9_EXTCHARS = array(
> > 166, // S with caron (hachek)
> > 168, // s with caron (hachek)
> > 180, // Z with caron (hachek)
> > 184, // z with caron (hachek)
> > 188, // Capital ligature OE
> > 189, // Small ligature oe
> > 190, // Y with diaeresis
> > 192, // A Grave
> > 193, // A Acute
> > 194, // A Circumflex
> > 195, // A Tilde
> > 196, // A Diaeresis
> > 197, // A Ring
> > 198, // AE Digraph
> > 199, // C Cedilla
> > 200, // E Grave
> > 201, // E Acute
> > 202, // E Circumflex
> > 203, // E Diaeresis
> > 204, // I Grave
> > 205, // I Acute
> > 206, // I Circumflex
> > 207, // I Diaeresis
> > 208, // Uppercase Eth
> > 209, // N Tilde
> > 210, // O Grave
> > 211, // O Acute
> > 212, // O Circumflex
> > 213, // O Tilde
> > 214, // O Diaeresis
> > 216, // O Slash
> > 217, // U Grave
> > 218, // U Acute
> > 219, // U Circumflex
> > 220, // U Diaeresis
> > 221, // Y Acute
> > 222, // Uppercase Thorn
> > 223, // German Double s
> > 224, // a Grave
> > 225, // a Acute
> > 226, // a Circumflex
> > 227, // a Tilde
> > 228, // a Diaeresis
> > 229, // a Ring
> > 230, // ae Digraph
> > 231, // c Cedilla
> > 232, // e Grave
> > 233, // e Acute
> > 234, // e Circumflex
> > 235, // e Diaeresis
> > 236, // i Grave
> > 237, // i Acute
> > 238, // i Circumflex
> > 239, // i Diaeresis
> > 240, // Lowercase Eth
> > 241, // n Tilde
> > 242, // o Grave
> > 243, // o Acute
> > 244, // o Circumflex
> > 245, // o Tilde
> > 246, // o Diaeresis
> > 248, // o Slash
> > 249, // u Grave
> > 250, // u Acute
> > 251, // u Circumflex
> > 252, // u Diaeresis
> > 253, // y Acute
> > 254, // Lowercase Thorn
> > 255, // y Diaeresis
> > );
>
> > // Function to turn array above into a string.
> > function _charcodes_to_string($codes) {
> > $output = '';
> > foreach($codes as $code) {
> > $output .= chr($code);
> > }
> > return $output;
>
> > }
>
> > // Special chars character string for validation regexps.
> > global $LATIN_9_EXTCHARS_STRING;
> > $LATIN_9_EXTCHARS_STRING = _charcodes_to_string($LATIN_9_EXTCHARS);
>
> > === Put in bootstrap.php -- ENDS ===
>
> > Then the actual validation function:
>
> > === Put in app_model.php -- STARTS ===
>
> > /**
> > * Validator function for alphanumeric values with chars
> > * from the Latin-9 charset.
> > *
> > * @param array $data The data containing the field to be validated
> > as passed by the framework.
> > * @param boolean $digits Allow digits, true or false.
> > * @param boolean $spaces Allow spaces, true or false.
> > * @return boolean true if field validates, false if not.
> > */
> > function latin9AlphaNumeric($data, $digits, $spaces) {
>
> > // $data should contain a single element, the field being
> > validated.
> > $target = array_pop($data);
>
> > // Compile the regexp.
> > $regex = '/[^A-Z' . $GLOBALS['LATIN_9_EXTCHARS_STRING'];
> > if ($digits === true) $regex .= '\\d';
> > if ($spaces === true) $regex .= ' ';
> > $regex .= ']/i';
>
> > // If preg_match returns 0 no offending chars were found, return
> > true.
> > // In any other case return false.
> > return preg_match($regex, $target) == 0 ? true : false;
>
> > }
>
> > === Put in app_model.php -- ENDS ===
>
> > The validation function has parameters to allow/disallow digits and/or
> > spaces. I created wrappers (like latin9Alpha(), latin9AlphaNumeric()
> > etc.) for it to use in my validation definitions without extra
> > arguments, but it could be called straight as-is as well. Then you
> > just need to call it with both flags (digits, spaces) defined.
> > Otherwise CakePHP will pass some extra data as the second argument,
> > messing up the true/false evaluation for the flags. Refer to custom
> > validation functions with arguments in the 1.2 docs for details.
>
> > Hopefully this is useful to someone else out there! :)
>
> > Regards,
> > Max Romantschukhttp://max.romantschuk.fi/
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Cake
PHP" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---