Intereting Posts
Ключ раздела Cassandra для данных временных рядов Как получить все переменные, определенные в текущей таблице / таблице символов? Могу ли я имитировать взаимодействие Tumblr, такое как reblog и т. П. Через API? «Неустранимая ошибка: не удается переопределить класс» … но класс не был объявлен Мобильный переадресация с использованием htaccess Неверно сформированное числовое значение Изменение значения HTML DropDown по умолчанию со значением MySQL Функция заполняет первый список, но не второй из таблицы базы данных php class extends, переменная из другого расширенного класса Зарезервированные слова PHP как пространства имен и имена классов Избегайте условий гонки в PHP на отправке: Пожалуйста, не нажимайте кнопку «Отправить» более одного раза! Yii – «белый экран смерти», советы по отладке google-api-php-client: Неверный клиентский секретный файл JSON PHP: функция группировки массива объектов по значению Расширение Symfony2 Twig

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

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

Первые четыре символа должны быть числами, а затем запятыми, а затем любыми алфавитными символами или пробелами … Я уже читал, что если я добавлю / 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);