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);