UTF-8 в регулярных выражениях PHP

Мне нужна помощь с регулярными выражениями. Моя строка содержит символы Юникода, и приведенный ниже код не работает.

Первые четыре символа должны быть числами, затем запятая, а затем любые буквенные символы или пробелы... Я уже читал, что если я добавлю /u в конце регулярного выражения, но это не сработало для меня...

Мой код работает с не-Unicode символами

$post = '9999,škofja loka';;
echo preg_match('/^[0-9]{4},[\s]*[a-zA-Z]+', $post);

Спасибо за ваши ответы!

4 ответа

Обновленный ответ:
Это сейчас проверено и работает

$post = '9999, škofja loka';
echo preg_match('/^\\d{4},[\\s\\p{L}]+$/u', $post);

\\w не будет работать, потому что он не содержит все буквы Unicode и содержит также [0-9_] в дополнение к письмам.

Важным является также u модификатор для активации режима Юникод.

Если после запятой могут быть буквы или пробелы, вы должны поместить их в один и тот же класс символов, в вашем регулярном выражении должно быть 0 или более пробелов после запятой, а затем только буквы.

См. http://www.regular-expressions.info/php.html для подробностей PHP регулярных выражений.

\\p{L} (Unicode буква) объясняется здесь

Важным является также использование конца строки $ чтобы убедиться, что действительно полная строка проверена, в противном случае она будет соответствовать только первому пробелу и игнорировать остальные, например.

[a-zA-Z] будут совпадать только буквы в диапазоне az и AZ. У вас есть не-US-ASCII буквы, и поэтому ваше регулярное выражение не будет совпадать, независимо от /u модификатор. Вам нужно использовать слово escape-последовательность слова (\w).

$post = '9999,škofja loka';
echo preg_match('/^[0-9]{4},[\s]*[\w]+/u', $post);

Проблема в вашем регулярном выражении. Вы прямо говорите, что примете только a b c ... z A B C ... Z, š не в наборе az. Помните, š так же отличается от s как любой другой персонаж.

Так что если вы действительно хотите последовательность букв, то вам нужно проверить свойства Юникода. например

echo preg_match('/^[0-9]{4},[\s]*\p{L}+', $post);

Это должно работать, потому что \p{L} соответствует любому символу Юникода, который считается буквой. Не только от А до Я.

Добавить uи запомните косую черту:

echo preg_match('/^[0-9]{4},[\s]*[a-zA-Z]+/u', $post);

Отредактировано:

echo preg_match('/^\d{4},(?:\s|\w)+/u', $post);
Другие вопросы по тегам