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
-~----------~----~----~----~------~----~------~--~---

Reply via email to