Итак, проблема как предполагается. Вы не используете модификатор /u
. Это означает, что PCRE не будет искать символы UTF-8.
В любом случае, вот как это должно быть сделано:
var_dump(preg_match('/^[\p{L}\s]+$/u', "ø"));
И работает на всех моих версиях. В других может быть ошибка, но это вряд ли здесь.
Ваша проблема в том, что это также работает:
var_dump(preg_match('/^[\p{L}\s]+$/', utf8_decode("ø")));
Обратите внимание, что здесь используется ISO-8859-1 вместо UTF-8, и в нем отсутствует модификатор /u
. Результат int(1)
. Очевидно, что PCRE интерпретирует Latin-1 ø
как соответствующий \p{L}
в режиме, отличном от /u
. (Большинство однобайтовых \ xA0- \ xFF являются буквенными символами в Latin-1, а 8-битная кодовая точка такая же, как в Unicode, так что это на самом деле нормально.)
Вывод: на самом деле вы вводите ISO-8859-1. Вот почему это случайно сработало для вас без /u
. Измените это и будьте как следует с входными кодировками.