开发者

preg_match and (non-English) Latin characters?

开发者 https://www.devze.com 2023-02-20 03:28 出处:网络
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]+$/

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-/unicode 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.

0

精彩评论

暂无评论...
验证码 换一张
取 消