I have a XHTML form where I ask people to enter their full name. I then match that with preg_match()
using this pattern: /^[\p{L}\s]+$/
On my local server running PHP 5.2.13 (PCRE 7.9 2009-04-11) this works fine. On the webhost running PHP 5.2.10 (PCRE 7.3 2007-08-28) it doesn't match when the entered string contains the Danish Latin character ø ( http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=%F8&mode=开发者_StackOverflow中文版char ).
Is this a bug? Is there a work around?
Thank you in advance!
So, the problem is as presumed. You are not using the /u
modifier. This means that PCRE will not look for UTF-8 characters.
In any case, this is how it should be done:
var_dump(preg_match('/^[\p{L}\s]+$/u', "ø"));
And works on all my versions. There might be a bug in others, but that's not likely here.
Your problem is that this also works:
var_dump(preg_match('/^[\p{L}\s]+$/', utf8_decode("ø")));
Notice that this uses ISO-8859-1 instead of UTF-8, and leaves out the /u
modifier. The result is int(1)
. Obviously PCRE interprets the Latin-1 ø
as matching \p{L}
when in non-/u
nicode mode. (Most of the single-byte \xA0-\xFF are letter symbols in Latin-1, and the 8-bit code point as the same as in Unicode, so that's actually ok.)
Conclusion: Your input is actually ISO-8859-1. That's why it accidentally worked for you without the /u
. Change that, and be eaxact with input charsets.
精彩评论