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

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

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

Мой код работает с символами, отличными от юникода

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

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

Ответы

Ответ 1

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

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

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

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

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

Подробнее о деталях php regex см. http://www.regular-expressions.info/php.html

\\p{L} (письмо Юникода) объясняется здесь

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

Ответ 2

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

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

Ответ 3

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

Итак, если вам действительно нужна последовательность букв, вам нужно проверить свойства юникода. например.

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

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

Ответ 4

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

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

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

echo preg_match('/^\d{4},(?:\s|\w)+/u', $post);