Мне нужна помощь с регулярными выражениями. Моя строка содержит символы Юникода, а код ниже не работает.
Первые четыре символа должны быть числами, а затем запятыми, а затем любыми алфавитными символами или пробелами … Я уже читал, что если я добавлю / u на конец регулярного выражения, но это не сработало для меня …
Мой код работает с символами, отличными от юникода
$post = '9999,škofja loka';; echo preg_match('/^[0-9]{4},[\s]*[a-zA-Z]+', $post);
Спасибо за ваши ответы!
Обновленный ответ:
Это теперь проверено и работает
$post = '9999, škofja loka'; echo preg_match('/^\\d{4},[\\s\\p{L}]+$/u', $post);
\\w
не будет работать, потому что он не содержит всех букв в [0-9_]
и также содержит [0-9_]
дополнительно к буквам.
Важным является также u
модификатор u
для активации режима Unicode.
Если после запятой могут быть буквы или пробелы, тогда вы должны поместить их в один и тот же класс символов, в вашем регулярном выражении после запятой есть 0 или более пробелов, а затем есть только буквы.
См. http://www.regular-expressions.info/php.html для подробных сведений о php regex.
Здесь \\p{L}
(буква Юникода)
Важно также использовать конец границы строки $
чтобы убедиться, что действительно полная строка проверена, иначе она будет соответствовать только первым пробелам и, например, игнорировать остальные.
[a-zA-Z]
будет соответствовать только буквам в диапазоне от az и AZ. У вас есть буквы, отличные от US-ASCII, и поэтому ваше регулярное выражение не будет совпадать, независимо от модификатора /u
. Вам нужно использовать escape-последовательность символа слова ( \w
).
$post = '9999,škofja loka'; echo preg_match('/^[0-9]{4},[\s]*[\w]+/u', $post);
Проблема заключается в вашем регулярном выражении. Вы прямо заявляете, что будете принимать только abc ... z ABC ... Z
š
не находится в множестве az. Помните, что это не так, как любой другой персонаж.
Поэтому, если вам действительно нужна последовательность букв, вам нужно проверить свойства юникода. например
echo preg_match('/^[0-9]{4},[\s]*\p{L}+', $post);
Этот shouuld работает, потому что \p{L}
соответствует любому символу юникода, который считается буквой. Не только от A до Z.
Добавьте u
и запомните конечную косую черту:
echo preg_match('/^[0-9]{4},[\s]*[a-zA-Z]+/u', $post);
Отредактировано:
echo preg_match('/^\d{4},(?:\s|\w)+/u', $post);