preg_match and (non-English) Latin characters?

2019-01-19 20:37发布

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=char ).

Is this a bug? Is there a work around?

Thank you in advance!

1条回答
Anthone
2楼-- · 2019-01-19 21:14

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.

查看更多
登录 后发表回答