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